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

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

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

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

Q&A

解決済

1回答

1077閲覧

二次元配列の要素の中に要素がなければ、新しく配列を作って、要素を追加したい

imamoto_browser

総合スコア1161

PHP

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

0グッド

1クリップ

投稿2017/04/27 17:54

編集2017/04/27 18:01

お世話になります。二次元配列の要素の中に要素がなければ、新しく配列を追加するようなコードを書きたいのですが、どのようにすればよろしいでしょうか。

やりたいこと:
$arr = array();
$arr2 = array(1 , 2);
array_push($arr , $arr2);
$arr3 = array("1 7","3 4","5 6","1 5","2 4");

foreachで$arr3の値を回して、その要素の最初の値が$arrの中にある配列(初期配列はarr2)の要素と一致すれば、$arr3の第2要素(最初の例でいうと7)を$arrの中のarr2にpushする。なければ、新しく配列を作って、$arrに新しく配列をpushする。

上の例でいうと、array(1 , 2)には"1 7"の1があるので、array(1 , 2)をarray(1 , 2 , 7)にしたい。次の"3 4"はないので、$arr4 = array(3 , 4)として、$arrの第2要素としてpushしたい。
Array ( [0] => Array ( [0] => 1 [1] => 2 ) )

Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 7) )

Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 7) [1] => Array ( [0] => 3 [1] => 4 ) )

これをarr3の与えられる配列の値が1<N<100で、要素の数も1<N<100でランダムに与えられても、上のルールに従った正しい配列を作りたいのですが、どのようなロジックを組めばよろしいでしょうか。

答えでなくても、ヒントでも構いません。この記事が参考になるよとかでもいいので、教えていただければ幸いです。

#追記です
arr3の複数の値が複数の配列に含まれる場合は配列をマージしたいです。

上の例で言うと、arr3の"1 5"のところで、Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 7) )とArray ( [2] => Array ( [0] => 5 [1] => 6 ) )をマージして、 Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 5 [3] => 6 [4] => 7) )としたいです。

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

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

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

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

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

Zuishin

2017/04/27 23:44

特に知識もいらないし実用性もないし、宿題かテストか知らないけど、自分で考えて解かなきゃいけない問題なんじゃないですか?
miyahan

2017/04/28 00:06

やりたいことが定義ができているのであれば、その通りに for と if をたくさん書けばよいと思いますが、何をためして何ができなかったのでしょうか?
guest

回答1

0

ベストアンサー

ちょっとロジックを整理

$arr3 = array("1 7","3 4","5 6","1 5","2 4");
について、先頭が1,2なら0、そうでないなら1に振り分ける
頭からやると
"1 7"=>0:[1,7],1:NULL
"3 4"=>0:[1,7],1:[3,4]
"5 6"=>0:[1,7],1:[3,4,5,6]
"1 5"=>0:[1,7,1,5],1:[3,4,5,6]
※ここで0に被った1をどうする?0と1両方に存在する5をどうする
仮に整理してこうなったとして
"1 5"=>0:[1,7,5],1:[3,4,6]
"2 4"=>0:[1,7,5,2,4],1:[3,6]
でよいのでしょうか?
データはソートしたほうがよいのでしょうか?

sample

PHP

1$a2 = array(1,2); 2$a3 = array("1 7","3 4","5 6","1 5","2 4"); 3$a4=[]; 4array_walk($a3,function($x) use($a2,&$a4){ 5 $y=explode(" ",$x); 6 if(count($a4)==0) $a4=[[],[]]; 7 if(in_array($y[0],$a2)){ 8 $a4[0]=array_unique(array_merge($a4[0],$y)); 9 $a4[1]=array_diff($a4[1],$y); 10 }else{ 11 $a4[1]=array_unique(array_merge($a4[1],$y)); 12 } 13}); 14print_R($a4);

追記

なるほど、だいぶ読み違えていたようです
初期値=>0:[1,2],1:NULL
"1 7"=>0:[1,2,7],1:NULL //先頭1が[1,2]に含まれるから
"3 4"=>0:[1,2,7],1:[3,4] //先頭3が[1,2,7]に含まれないから
"5 6"=>0:[1,2,7],1:[3,4,5,6] //先頭5が[1,2,7]に含まれないから
"1 5"=>0:[1,2,7,1,5],1:[3,4,5,6] //先頭1が[1,2,7]に含まれるから
ただし、0:および1:はユニークデータで、1:には0:のデータが含まれないとすると
整理して=>0:[1,2,7,5],1:[3,4,6]
"2 4"=>0:[1,2,7,5,2,4],1:[3,6]
整理して=>0:[1,2,7,5,4],1:[3,6]

という流れでしょうか?

debug版

PHP

1$a2 = array(1,2); 2$a3 = array("1 7","3 4","3 2","5 6","1 5","2 5","2 4","7 3"); 3$a4=[$a2,[]];p(); 4array_walk($a3,function($x) use(&$a4){ 5 print $x."<br>\n"; 6 $y=explode(" ",$x); 7 if(in_array($y[0],$a4[0])){ 8 if(!in_array($y[1],$a4[0])) array_push($a4[0],(int) $y[1]); 9 p(); 10 if(in_array($y[1],$a4[1])) array_splice($a4[1],array_search($y[1],$a4[1]),1); 11 p(); 12 }else{ 13 if(!in_array($y[0],$a4[1])) array_push($a4[1],(int) $y[0]); 14 if(!in_array($y[1],$a4[1])) array_push($a4[1],(int) $y[1]); 15 p(); 16 if(in_array($y[1],$a4[0])) array_splice($a4[1],array_search($y[1],$a4[1]),1); 17 p(); 18 } 19}); 20print_R($a4); 21 22function p(){ 23 global $a4; 24 print json_encode($a4)."<br>\n"; 25}

投稿2017/04/28 00:37

編集2017/04/28 04:02
yambejp

総合スコア114769

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

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

imamoto_browser

2017/04/28 02:57

回答ありがとうございます。 "5 6"=>0:[1,7],1:[3,4,5,6] "1 5"=>0:[1,7,1,5],1:[3,4,5,6] の場合ですが、この場合は最初の0:[1,7]に"1 5"の1がヒットするので、 "1 5"=>0:[1,7,1,5],1:[3,4,5,6] ではなく、 "1 5"=>0:[1,7,5],1:[3,4,5,6] としたいです。(先頭の配列への適応を優先する) 仮に整理してこうなったとして "1 5"=>0:[1,7,5],1:[3,4,6] "2 4"=>0:[1,7,5,2,4],1:[3,6] 上記の場合はソートして、 "1 5"=>0:[1,5,7],1:[3,4,6] "2 4"=>0:[1,2,4,5,7],1:[3,6] としたいです。 あと、話は変わりますが、$a4[1]=array_diff($a4[1],$y);だと、$a4[1]にペアではなく、1個だけ要素が代入されてしまうと思うのですが、ロジック上、新しい配列にpushされる配列は必ずペアでないとおかしいと思うのですが、これはロジックの組み方の違いなのでしょうか。 私のロジックだと、 if(in_array($y[0],$a2))だけでなく、if(in_array($y[1],$a2))という判定も必要かと思うのですが。(でないと、$a3配列の2個目の要素が$a2に含まれているか判定できない) 上記のロジックの整理をされていることから察するに、おそらく、そのあたりの私の説明に齟齬があったかなと思っております。
yambejp

2017/04/28 04:23

だいぶ誤解があったのと、多分まだ解釈に誤りがあるような気がします とりあえずdebug版で流れを見られますので、ロジックが違うところがあれば ご指摘ください (sampleをもう少しパターンを多めに提示いただければ、より精度があげられます)
imamoto_browser

2017/04/28 13:31

再度、ソースコードをあげていただき、ありがとうございました。パターンというか、最初の命題にあるように、$a4[0]と$a4[1]だけでなく、グループが増えるたびに$a4[2]、$a4[3]と追加したかったのですが、それは、for文でできそうなので、自分でやってみようと思います。BAとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問