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

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

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

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

Q&A

解決済

1回答

619閲覧

PHPの多次元配列を再編するときに、勝手に階層が追加されてしまう

busi

総合スコア22

PHP

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

0グッド

0クリップ

投稿2019/09/08 05:40

###実現したいこと
下記$menusから、三次元目だけの配列を作りたいです。

つまり$result = [ 'salad', 'soop', 'cake', 'beer', 'sine' ];が目標になります。

###該当のソースコード

php

1 $menus = [ 2 'food' => [ 3 'appetizers' => [ 'salad', 'soop' ], 4 'dessert ' => [ 'cake' ] 5 ], 6 'drink' => [ 7 'liquor' => [ 'beer', 'wine' ] 8 ] 9 ];

###発生している問題
下記のget_menus( $type )という関数で、$typeで指定した次元の配列を取得したいと思っています。

たとえば二次元目だけの取得ならば$primary = get_menus('primary');です。

しかし三次元目を取得しようと思い$secondary = get_menus('secondary');を書いても、なぜか実現したいような構造にならず、階層が追加されてしまうといった状況になっています。

###試したこと
こちらが問題のget_menus( $type )です。
どうすれば三次元目も取得できるようにできますでしょうか。

php

1function get_menus( $type ){ 2 3 // 全メニュー 4 $menus = [ 5 'food' => [ 6 'appetizers' => [ 'salad', 'soop' ], 7 'dessert ' => [ 'cake' ] 8 ], 9 'drink' => [ 10 'liquor' => [ 'beer', 'wine' ] 11 ] 12 ]; 13 14 // 全て取得 15 if( $type=='all' ){ 16 $result = array_merge_recursive( $menus['food'], $menus['drink'] ); 17 } 18 19 // 二次元目だけ取得 20 if( $type=='primary' ){ 21 $result = []; 22 foreach( $menus as $menu ){ 23 foreach( $menu as $m=>$k ){ 24 $result[] = $m; 25 } 26 } 27 } 28 29 // 三次元目だけ取得 30 if( $type=='secondary' ){ 31 $result = []; 32 foreach( $menus as $menu ){ 33 foreach( $menu as $m=>$k ){ 34 $result[] = $k; // $kだけ入ってほしいのに、勝手に階層が追加されてしまう 35 } 36 } 37 } 38 39 return $result ; 40} 41 42// 二次元目はできる 43$primary= get_menus('primary'); 44var_dump( $primary); 45 46// 三次元目ができない 47$secondary = get_menus('secondary'); 48var_dump( $secondary); 49

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

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

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

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

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

guest

回答1

0

ベストアンサー

php

1function array_flatten($arr){ 2 $v = []; 3 array_walk_recursive($arr, function($e)use(&$v){$v[] = $e;}); 4 return $v; 5}

などで最終的に flat にしてはどうでしょうか。

参考: phpで array flatten をやる

投稿2019/09/08 05:50

編集2019/09/08 05:50
unhappychoice

総合スコア1531

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

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

busi

2019/09/08 06:56 編集

ありがとうございます。これは良いですね。ところで質問のコードではなぜ、階層が勝手に追加されてしまうことになるのか、その理屈について分かりますでしょうか? $result[] = $k; という処理は 「$k」を「$result」に追加していく という処理ですよね? このとき「$k」は値だけだと思うのですが、なぜ配列に追加していくと階層が…?
unhappychoice

2019/09/08 06:59

$k == [ 'salad', 'soop' ] なので [] に $k をいれると [['salad', 'soop']] になるという話ですかね? その次は $k == ['cake'] かと思いますので [['salad', 'soop'], ['cake']] のようになると思います
busi

2019/09/09 02:53 編集

そしたらこうしてもう一回ループを追加してもよかったわけですか。 // 三次元目だけ取得 if( $type=='secondary' ){ $result = []; foreach( $menus as $menu ){ foreach( $menu as $m=>$k ){ foreach( $k as $x ){ // もう一回ループを追加 $result[] = $x; } } } } でもこうfoeachがたくさんあるより、ご提示の方がいいですね。いろいろありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問