質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

989閲覧

PHPで条件に合わせて配列の出力を分けるのに苦戦しています。

love_kinniky

総合スコア22

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/02/03 11:19

編集2019/02/05 13:25

###【実現したいこと】
PHPで、次の【対象の配列】を、後述する【目的の出力】にしたいです。

そのための【考えたコード】について直すべき部分を教えてもらえませんでしょうか?

かなり長いです。すみません。。

###【対象の配列】

php

1<?php 2/* 3配列 4 - 同じ日付で 'adtion' の値は重複しない ('2019-01-02'に'escape'が2つあるとかは無い) 5 - 'time' と 'id' は同じ数(いつ誰がやったかを示す) 6 - 'page' は配列3つずつ増えていく(ページ分割に使う) 7*/ 8$array = array( 9 '2019-01-02'=> array( 10 array( 11 'action'=>'escape', 12 'dialogue'=>'覚えてやがれー!', 13 'time'=>array('2019-01-02 18:00:00.000','2019-01-01 13:00:00.000'), 14 'last_update'=>'2019-01-02 18:00:00.000', 15 'id'=>array('9','1'), 16 'page'=>'1', 17 ), 18 array( 19 'action'=>'attack', 20 'target'=>'6', 21 'time'=>array('2019-01-02 15:00:00.000','2019-01-02 01:00:00.000'), 22 'last_update'=>'2019-01-02 15:00:00.000', 23 'id'=>array('14','8'), 24 'page'=>'1', 25 ), 26 ), 27 '2019-01-01'=> array( 28 array( 29 'action'=>'propose', 30 'dialogue'=>'たこ焼きはいかがでしょうか?', 31 'time'=>array('2019-01-01 15:00:00.000','2019-01-01 01:00:00.000'), 32 'last_update'=>'2019-01-01 15:00:00.000', 33 'id'=>array('36','5'), 34 'page'=>'1', 35 ), 36 array( 37 'action'=>'attack', 38 'target'=>'7', 39 'time'=>array('2019-01-01 16:00:00.000','2018-12-31 22:00:00.000','2018-12-25 12:00:00.000'), 40 'last_update'=>'2019-01-01 16:00:00.000', 41 'id'=>array('1','15','3'), 42 'page'=>'2', // 4つ目の配列なので2になる 43 ), 44 ), 45); 46?>

###【目的の出力】
上の【対象の配列】をこのようにしたいです。

'page'=>'2'の配列は次のページとして扱うので、上の配列は4つありますがここの出力は'page'=>'1'の3つになります。

html

1<ul> 2 <li> 3 <p>escapeした人の一覧です。</p> 4 <ul><li>9番さん</li><li>1番さん</li></ul> 5 <p>覚えてやがれー!</p> 6 <p>2019-01-02</p> 7 </li> 8 <li> 9 <p>6番さんがattackされました。</p> 10 <p>attackした人の一覧です。</p> 11 <ul><li>14番さん</li><li>8番さん</li></ul> 12 <p>2019-01-02</p> 13 </li> 14 <li> 15 <p><a href="36">36番</a>さんと<a href="5">5</a>番さんがproposeしています。</p> 16 <p>たこ焼きはいかがでしょうか?</p> 17 <p>2019-01-01</p> 18 </li> 19<ul>

###【考えたコード】
追記:質問時のコードが支離滅裂であったので、papinianus様から質問内容に沿った形でご修正頂きました。

php

1<?php 2/* 3配列 4 - 同じ日付で 'adtion' の値は重複しない ('2019-01-02'に'escape'が2つあるとかは無い) 5 - 'time' と 'id' は同じ数(いつ誰がやったかを示す) 6 - 'page' は配列3つずつ増えていく(ページ分割に使う) 7*/ 8$array = array( 9 '2019-01-02'=> array( 10 array( 11 'action'=>'escape', 12 'dialogue'=>'覚えてやがれー!', 13 'time'=>array('2019-01-02 18:00:00.000','2019-01-01 13:00:00.000'), 14 'last_update'=>'2019-01-02 18:00:00.000', 15 'id'=>array('9','1'), 16 'page'=>'1', 17 ), 18 array( 19 'action'=>'attack', 20 'target'=>'6', 21 'time'=>array('2019-01-02 15:00:00.000','2019-01-02 01:00:00.000'), 22 'last_update'=>'2019-01-02 15:00:00.000', 23 'id'=>array('14','8'), 24 'page'=>'1', 25 ), 26 ), 27 '2019-01-01'=> array( 28 array( 29 'action'=>'propose', 30 'dialogue'=>'たこ焼きはいかがでしょうか?', 31 'time'=>array('2019-01-01 15:00:00.000','2019-01-01 01:00:00.000'), 32 'last_update'=>'2019-01-01 15:00:00.000', 33 'id'=>array('36','5'), 34 'page'=>'1', 35 ), 36 array( 37 'action'=>'attack', 38 'target'=>'7', 39 'time'=>array('2019-01-01 16:00:00.000','2018-12-31 22:00:00.000','2018-12-25 12:00:00.000'), 40 'last_update'=>'2019-01-01 16:00:00.000', 41 'id'=>array('1','15','3'), 42 'page'=>'2', // 4つ目の配列なので2になる 43 ), 44 ), 45); 46 47/* 48idをリストで出力するための関数 49*/ 50function echo_list_id($array/* //here 追加*/){ 51 foreach ($array['id'] as $id) { //here 52 echo '<li>'.$id.'番さん</li>'; //here 53 } 54} 55 56/* 57配列をリストで出力するための関数 58*/ 59function echo_list_content($array/* //here $pageはやめた*/, $page = "1" /* //here 追加*/){ 60 // リスト出力 61 echo '<ul>'; 62 foreach ($array as $key => $ks) { 63 foreach($ks as $k){ //here 64 $date = substr($k['last_update'], 0, strcspn($k['last_update'],' ')); // 日付だけ取得 65 // 該当ページの配列だけ出力する 66 if( $k['page'] == $page ){ 67 // attackの場合 68 if( $k['action'] == 'attack' ){ 69 echo '<li>'; 70 echo '<p>'.$k['target'].'番さんがattackされました!</p>'; 71 echo '<p>attackした人の一覧です。</p>'; 72 echo '<ul>'.echo_list_id($k).'</ul>'; 73 echo '<p>'.$date.'</p>'; 74 echo '</li>'; 75 } 76 // escapeの場合 77 if( $k['action'] == 'escape' ){ 78 echo '<li>'; 79 echo '<p>escapeした人の一覧です。</p>'; 80 echo '<ul>'.echo_list_id($k).'</ul>'; 81 echo '<p>'.$k['dialogue'].'</p>'; 82 echo '<p>'.$date.'</p>'; 83 echo '</li>'; 84 } 85 // proposeの場合 86 if( $k['action'] == 'propose' ){ 87 echo '<li>'; 88 //here echo '<p><a href="'.$k['page'][0].'">'.$k['page'][0].'番</a>さんと<a href="'.$k['page'][1].'">'.$k['page'][1].'番</a>さんがproposeしています。</p>'; 89 echo '<p>'.$k['dialogue'].'</p>'; 90 echo '<p>'.$date.'</p>'; 91 echo '</li>'; 92 } 93 } 94 } //here 95 } 96 echo '</ul>'; 97 // 次のページを更新 98 $nextpage = $page++; 99 //setcookie("page", $nextpage); //here 出力後にcookieかいちゃだめやで 100} 101 102/* 103ページごとにリスト出力 104*/ 105// ページを取得 106$page = isset($_COOKIE["page"]) ? $_COOKIE["page"] : ""; 107// リスト出力 108echo_list_content($array);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

plato

2019/02/03 12:26

具体的に躓いている点はどこになるのでしょう? エラーや現状の出力がうまくいかない等の場合,それらを記載されたほうがいいと思います.
m.ts10806

2019/02/03 13:27

この内容だとそもそも対象のfunctionに$arrayが届いていないような?
love_kinniky

2019/02/05 13:22

遅くなりました。ご指摘ありがとうございます。解決いたしました。
guest

回答2

0

エラーなく実行できるところがこれなんで、とりあえず、質問をこれに修正してもらえませんか?
//hereっていうところが添削したところです。すみませんが、どう違うかは自分でみてください。

まだ理想になっているかまで見てませんが、とにかくここが出発点です。

php

1<?php 2/* 3配列 4 - 同じ日付で 'adtion' の値は重複しない ('2019-01-02'に'escape'が2つあるとかは無い) 5 - 'time' と 'id' は同じ数(いつ誰がやったかを示す) 6 - 'page' は配列3つずつ増えていく(ページ分割に使う) 7*/ 8$array = array( 9 '2019-01-02'=> array( 10 array( 11 'action'=>'escape', 12 'dialogue'=>'覚えてやがれー!', 13 'time'=>array('2019-01-02 18:00:00.000','2019-01-01 13:00:00.000'), 14 'last_update'=>'2019-01-02 18:00:00.000', 15 'id'=>array('9','1'), 16 'page'=>'1', 17 ), 18 array( 19 'action'=>'attack', 20 'target'=>'6', 21 'time'=>array('2019-01-02 15:00:00.000','2019-01-02 01:00:00.000'), 22 'last_update'=>'2019-01-02 15:00:00.000', 23 'id'=>array('14','8'), 24 'page'=>'1', 25 ), 26 ), 27 '2019-01-01'=> array( 28 array( 29 'action'=>'propose', 30 'dialogue'=>'たこ焼きはいかがでしょうか?', 31 'time'=>array('2019-01-01 15:00:00.000','2019-01-01 01:00:00.000'), 32 'last_update'=>'2019-01-01 15:00:00.000', 33 'id'=>array('36','5'), 34 'page'=>'1', 35 ), 36 array( 37 'action'=>'attack', 38 'target'=>'7', 39 'time'=>array('2019-01-01 16:00:00.000','2018-12-31 22:00:00.000','2018-12-25 12:00:00.000'), 40 'last_update'=>'2019-01-01 16:00:00.000', 41 'id'=>array('1','15','3'), 42 'page'=>'2', // 4つ目の配列なので2になる 43 ), 44 ), 45); 46 47/* 48idをリストで出力するための関数 49*/ 50function echo_list_id($array/* //here 追加*/){ 51 foreach ($array['id'] as $id) { //here 52 echo '<li>'.$id.'番さん</li>'; //here 53 } 54} 55 56/* 57配列をリストで出力するための関数 58*/ 59function echo_list_content($array/* //here $pageはやめた*/, $page = "1" /* //here 追加*/){ 60 // リスト出力 61 echo '<ul>'; 62 foreach ($array as $key => $ks) { 63 foreach($ks as $k){ //here 64 $date = substr($k['last_update'], 0, strcspn($k['last_update'],' ')); // 日付だけ取得 65 // 該当ページの配列だけ出力する 66 if( $k['page'] == $page ){ 67 // attackの場合 68 if( $k['action'] == 'attack' ){ 69 echo '<li>'; 70 echo '<p>'.$k['target'].'番さんがattackされました!</p>'; 71 echo '<p>attackした人の一覧です。</p>'; 72 echo '<ul>'.echo_list_id($k).'</ul>'; 73 echo '<p>'.$date.'</p>'; 74 echo '</li>'; 75 } 76 // escapeの場合 77 if( $k['action'] == 'escape' ){ 78 echo '<li>'; 79 echo '<p>escapeした人の一覧です。</p>'; 80 echo '<ul>'.echo_list_id($k).'</ul>'; 81 echo '<p>'.$k['dialogue'].'</p>'; 82 echo '<p>'.$date.'</p>'; 83 echo '</li>'; 84 } 85 // proposeの場合 86 if( $k['action'] == 'propose' ){ 87 echo '<li>'; 88 //here echo '<p><a href="'.$k['page'][0].'">'.$k['page'][0].'番</a>さんと<a href="'.$k['page'][1].'">'.$k['page'][1].'番</a>さんがproposeしています。</p>'; 89 echo '<p>'.$k['dialogue'].'</p>'; 90 echo '<p>'.$date.'</p>'; 91 echo '</li>'; 92 } 93 } 94 } //here 95 } 96 echo '</ul>'; 97 // 次のページを更新 98 $nextpage = $page++; 99 //setcookie("page", $nextpage); //here 出力後にcookieかいちゃだめやで 100} 101 102/* 103ページごとにリスト出力 104*/ 105// ページを取得 106$page = isset($_COOKIE["page"]) ? $_COOKIE["page"] : ""; 107// リスト出力 108echo_list_content($array);

投稿2019/02/04 01:26

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

love_kinniky

2019/02/05 13:27

お世話になっております。質問のコードを仰るように修正致しました。proposeのとこでpageを出すとか、支離滅裂すぎましたね。ご修正ありがとうございます。後のご回答もこれからじっくり読ませて頂きたいと思います。ご連絡遅くなってしまい申し訳ございませんでした。
guest

0

ベストアンサー

前の回答で質問が更新された「ゼンテイ」で回答します。

  • 改行とかインデントはまあとりあえずやったけどこの際無視する

  • 問題点

  1. echo_list_idがダメ。配列の構造も引数の取りかたも何もわかってないけど、本質的にはechoしているのがだめ。呼び出し元のecho文が引数(っていうのかな)を評価したときに、この関数がはしるからここでechoするとこちらのechoが終わってから、元のechoが走る

従って、「liタグ内容は変動する」→「<ul></ul>」の順で出力される。
0. そこでsetcookieしちゃだめ
0. 自分で自分のデータ構造が分かってない、proposeのとこでpageを出そうとしていたが、id。このレベルで違うと仕様を知らない他人が読み取るのは不可能に近い

php

1<?php 2/* 3配列 4 - 同じ日付で 'adtion' の値は重複しない ('2019-01-02'に'escape'が2つあるとかは無い) 5 - 'time' と 'id' は同じ数(いつ誰がやったかを示す) 6 - 'page' は配列3つずつ増えていく(ページ分割に使う) 7*/ 8$array = array( 9 '2019-01-02'=> array( 10 array( 11 'action'=>'escape', 12 'dialogue'=>'覚えてやがれー!', 13 'time'=>array('2019-01-02 18:00:00.000','2019-01-01 13:00:00.000'), 14 'last_update'=>'2019-01-02 18:00:00.000', 15 'id'=>array('9','1'), 16 'page'=>'1', 17 ), 18 array( 19 'action'=>'attack', 20 'target'=>'6', 21 'time'=>array('2019-01-02 15:00:00.000','2019-01-02 01:00:00.000'), 22 'last_update'=>'2019-01-02 15:00:00.000', 23 'id'=>array('14','8'), 24 'page'=>'1', 25 ), 26 ), 27 '2019-01-01'=> array( 28 array( 29 'action'=>'propose', 30 'dialogue'=>'たこ焼きはいかがでしょうか?', 31 'time'=>array('2019-01-01 15:00:00.000','2019-01-01 01:00:00.000'), 32 'last_update'=>'2019-01-01 15:00:00.000', 33 'id'=>array('36','5'), 34 'page'=>'1', 35 ), 36 array( 37 'action'=>'attack', 38 'target'=>'7', 39 'time'=>array('2019-01-01 16:00:00.000','2018-12-31 22:00:00.000','2018-12-25 12:00:00.000'), 40 'last_update'=>'2019-01-01 16:00:00.000', 41 'id'=>array('1','15','3'), 42 'page'=>'2', // 4つ目の配列なので2になる 43 ), 44 ), 45); 46 47/* 48idをリストで出力するための関数 49*/ 50function echo_list_id($array/* //here 追加*/){ 51 $str = ""; 52 foreach ($array['id'] as $id) { //here 53 $str .= '<li>'.$id.'番さん</li>'; //here 54 } 55 return $str; 56} 57 58/* 59配列をリストで出力するための関数 60*/ 61function echo_list_content($array/* //here $pageはやめた*/, $page = "1" /* //here 追加*/){ 62 // リスト出力 63 echon('<ul>'); 64 foreach ($array as $key => $ks) { 65 foreach($ks as $k){ //here 66 $date = substr($k['last_update'], 0, strcspn($k['last_update'],' ')); // 日付だけ取得 67 // 該当ページの配列だけ出力する 68 if( $k['page'] == $page ){ 69 // attackの場合 70 if( $k['action'] == 'attack' ){ 71 echon(' <li>'); 72 echon(' <p>'.$k['target'].'番さんがattackされました!</p>'); 73 echon(' <p>attackした人の一覧です。</p>'); 74 echon(' <ul>'.echo_list_id($k).'</ul>'); 75 echon(' <p>'.$date.'</p>'); 76 echon(' </li>'); 77 } 78 // escapeの場合 79 if( $k['action'] == 'escape' ){ 80 echon(' <li>'); 81 echon(' <p>escapeした人の一覧です。</p>'); 82 echon(' <ul>'.echo_list_id($k).'</ul>'); 83 echon(' <p>'.$k['dialogue'].'</p>'); 84 echon(' <p>'.$date.'</p>'); 85 echon(' </li>'); 86 } 87 // proposeの場合 88 if( $k['action'] == 'propose' ){ 89 echon(' <li>'); 90 echon(' <p><a href="'.$k['id'][0].'">'.$k['id'][0].'番</a>さんと<a href="'.$k['id'][1].'">'.$k['id'][1].'番</a>さんがproposeしています。</p>');//here 91 echon(' <p>'.$k['dialogue'].'</p>'); 92 echon(' <p>'.$date.'</p>'); 93 echon(' </li>'); 94 } 95 } 96 } //here 97 } 98 echon('</ul>'); 99 // 次のページを更新 100 $nextpage = $page++; 101 //setcookie("page", $nextpage); 102} 103function echon($str) { 104 echo $str.PHP_EOL; 105} 106 107/* 108ページごとにリスト出力 109*/ 110// ページを取得 111$page = isset($_COOKIE["page"]) ? $_COOKIE["page"] : ""; 112// リスト出力 113echo_list_content($array);

投稿2019/02/04 01:44

編集2019/02/04 03:33
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

love_kinniky

2019/02/05 17:05

こんばんは。夜分遅くに失礼致します。 こちらのコードでイメージしていたようにできました。いつも本当にありがとうございます。 以下の2についてだけ、もしよろしければ教えて下さい。 ----- 1について echo_list_id($array)の$arrayは、echo_list_contentの中でecho_list_id($k)と使うことで取得できるわけですね。勉強になりました。 ----- 2について これだけ教えて頂きたいのですが、せっかく「$nextpage = $page++;」と増やしているのに、それをcookieに入れてあげる機会がなさそうに見えます。 いま考えているのは、「<button type="button" data-pagenumber="'.$page.'">もっと見る</button>」のようなボタンを作り、このボタンの$pageにはcookieの値を入力。そしてAjaxでその$pageにふさわしい配列を読んでいく。という機能です。 ですが$nextpageをcookieに入れてあげる機会がないと、このようなページ送りができないのではないかと思っています。 それともページ送りについては、何かもっと良い方法があったりしますでしょうか? ----- 3について 先ほども申し上げましたが、本当に解読して頂きありがとうございました。
papinianus

2019/02/06 07:28

ページ送りをどうするのがベストかはともかく、echoしたあとにsetcookieしちゃだめなだけで、一回ボタンを押したときには、必ずページは1しか繰り上がらないわけですから // ページを取得 $page = isset($_COOKIE["page"]) ? $_COOKIE["page"] : ""; の直後に setcookieすればいいだけです。 もしくは面倒にはなりますが、echo_list_contentをechoではなく、文字列をreturnする関数に全面書き変えすれば、元の位置でsetcookieしても問題はなくなります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問