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

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

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

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

Q&A

解決済

1回答

415閲覧

PHPで配列をn等分して、他の配列を連結したい

sakamotohuyumi

総合スコア5

PHP

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

0グッド

0クリップ

投稿2019/10/25 13:27

PHP初心者です。
配列の操作についてのご質問になります。
宜しくお願い致します。

前提・実現したいこと

「$args」という配列に、「$add_args」という配列を連結したいです。

概略は次の連結で、「連結したい配列をn等分して、実現したい配列を作ること」がゴールになります。

種類内容
元の配列$args = [[1,2]];
連結したい配列$add_args = [[3,4,5]];
実現したい配列[[1,2],[3,4],[5]];

元の配列と、実現したい配列

元となる配列「$args」はこちらです。(余分な階層があるように見えますが気にしないでください)

php

1// 元の配列 2$args = [ 3 'menu_origin' => [ 4 [ 5 'ids' => [1,2] 6 , 'key' => 'menu_origin' 7 ] 8 ], 9];

そして最終的に実現したい配列はこちらになります。キーに「_1」や「_2」という番号が振ってあるのがポイントで、これが「連結したい配列の、いくつめのn等分か」を示します。

php

1// 実現したい配列 2[ 3 // 元の配列 4 'menu_origin' => [ 5 [ 6 'ids' => [1,2] 7 , 'name' => 'menu_origin' 8 ] 9 ], 10 // 連結したい配列 11 'menu_apple_1' => [ 12 [ 13 'ids' => [3,4] 14 , 'name' => 'menu_apple_1' 15 ] 16 ], 17 'menu_apple_2' => [ 18 [ 19 'ids' => [5] 20 , 'name' => 'menu_apple_2' 21 ] 22 ], 23];

試したこと・発生している問題

最後に連結したい配列「$add_args」と、連結のコード「get_add_args()」を掲載いたします。

こちらのコードの問題としては、実現したい配列の階層とは異なってしまうことです。

つまり「menu_origin」が一階層目なのに対して、追加された「menu_apple_1」と「menu_apple_2」が二階層目に属してしまいます。

<?php // 初期配列 $args = [ 'menu_origin' => [ [ 'ids' => [1,2] , 'name' => 'menu_origin' ] ], ]; // 連結したい $add_args = get_add_args( 2 ); $args = array_merge( $add_args, $args ); var_export( $args ); // 連結の処理 function get_add_args( $page ){ $add_args = []; $menus = ['menu_apple']; // ←他にもmenu_grapeなどいくつか入ります foreach( $menus as $menu ){ // idを分割 $ids = [3,4,5,6,7]; // ←ここは変えられません $ids_divide = array_divide( $ids, $page ); // ←n等分します // 等分されたidを使って$add_argsを作る $i=0; foreach( $ids_divide as $ids ){ $key = $menu.'_'.$i; $add_args[] = [ $key => [ [ 'ids' => $ids , 'key' => $key ] ] ]; $i++; } } return $add_args; } // 配列をn等分 function array_divide($arr, $division) { $count = ceil(count($arr) / $division); $ret = array_chunk($arr, $count); return $ret; }

そして、二階層目に属してしまうならforeachの中を下記のように変更すればいいのでは?と思ったのですが……

php

1 $add_args[] = [ 2 $key => [ 3 ] 4 ];

↓こうすればいいのでは?

php

1 $add_args[] = // ←ここにあった階層を削除してみた 2 $key => [ 3 ];

ですがこうしますと「イコールにしてくれと」次のエラーになります。

PHP Parse error: syntax error, unexpected '=>' (T_DOUBLE_ARROW)

とはいえ、イコールにすれば「menu_apple_1」と「menu_apple_2」というキーが消えてしまいますし、どうすればいいか行き詰ってしまった状況にあります。

いかにして実現したい配列ができるでしょうか。
みなさまのご指南を賜りますようお願い申し上げます。

ツールのバージョン

PHPのバージョンは最新の7.2.0になります。

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

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

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

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

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

Take_it

2019/10/25 14:18

ソース読んでも貴方がやりたいことの流れがよく見えません。 ソースはこれで全文でしょうか? $menus = ['menu_apple']; // ←他にもmenu_grapeなどいくつか入ります これはどこかで$nemusの配列を別途定義しているのでしょうか・・・?
sakamotohuyumi

2019/10/25 15:20

確認遅くなりました。上の2点は仰る通りです。ご回答ありがとうございました。
guest

回答1

0

ベストアンサー

余分な階層(元の配列のmenu_origineの1個下の階層)がどういう意味を持っているのかがわからないのでとりあえず[0]としてありますが、なんらか連番等になるのであれば、そういう変数を設定して加えていけばいいと思います。

PHP

1 // 初期配列 2 $args = [ 3 'menu_origin' => [ 4 [ 5 'ids' => [1,2] 6 , 'name' => 'menu_origin' 7 ] 8 ], 9 ]; 10 11 // 連結したい 12 $add_args = get_add_args( 2 ); 13 $args = array_merge( $add_args, $args ); 14 var_export( $args ); 15 16 // 連結の処理 17 function get_add_args( $page ){ 18 $add_args = []; 19 20 $menus = ['menu_apple']; // ←他にもmenu_grapeなどいくつか入ります 21 foreach( $menus as $k=>$menu){ 22 // idを分割 23 $ids = [3,4,5,6,7]; // ←ここは変えられません 24 $ids_divide = array_divide( $ids, $page ); // ←n等分します 25 // 等分されたidを使って$add_argsを作る 26 $i=1; 27 foreach( $ids_divide as $ids ){ 28 29 $k = $menu.'_'.$i; 30 $args[$k][0]['ids'] = $ids; 31 $args[$k][0]['name'] = $k; 32 33 34 $i++; 35 } 36 } 37 38 return $args; 39 } 40 41 // 配列をn等分 42 function array_divide($arr, $division) { 43 $count = ceil(count($arr) / $division); 44 $ret = array_chunk($arr, $count); 45 return $ret; 46 }

上記の結果

Array ( [menu_apple_1] => Array ( [0] => Array ( [ids] => Array ( [0] => 3 [1] => 4 [2] => 5 ) [name] => menu_apple_1 ) ) [menu_apple_2] => Array ( [0] => Array ( [ids] => Array ( [0] => 6 [1] => 7 ) [name] => menu_apple_2 ) ) [menu_origin] => Array ( [0] => Array ( [ids] => Array ( [0] => 1 [1] => 2 ) [name] => menu_origin ) ) )

投稿2019/10/25 14:31

編集2019/10/25 14:35
Take_it

総合スコア357

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

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

sakamotohuyumi

2019/10/25 15:18

ありがとうございます。1つずつ追加していくのですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問