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

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

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

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

Q&A

解決済

3回答

3305閲覧

3つ以上の配列の多次元連想配列化+一部の配列について飛び石で取得

SugiuraY

総合スコア317

PHP

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

0グッド

0クリップ

投稿2016/08/29 14:40

現在以下の4つの配列があり、これを下部の多次元連想配列に組み替えたいと考えております。

<Before> ・元の配列 配列$tom array(3) { [0]=> string(3) "AAA" [1]=> string(3) "BBB" [2]=> string(3) "CCC"} 配列$ted array(3) { [0]=> string(3) "aaa" [1]=> string(3) "bbb" [2]=> string(3) "ccc"} 配列$matt array(3) { [0]=> string(3) "xxx" [1]=> string(3) "yyy" [2]=> string(3) "zzz"} 配列$john array(6) { [0]=> string(3) "000" [1]=> string(3) "111" [2]=> string(3) "222" [3]=> string(3) "333" [4]=> string(3) "444" [5]=> string(3) "555" }
<After> 組み替えたい連想配列 $array_comb = array( 'AAA'=> array([0]=>'aaa' [1]=>'xxx' [2]=>'000' [3]=>'333') 'BBB'=> array([0]=>'bbb' [1]=>'yyy' [2]=>'111' [3]=>'444') 'CCC'=> array([0]=>'ccc' [1]=>'zzz' [2]=>'222' [3]=>'555') )

つまり、$tomを連想配列の添字にして、$ted及び$mattの配列を順番どおに要素として組み込み、最後に$johnを飛び石(必ず[i]及び[i+3]の組み合わせで順番通り、これも要素として組み込みたい$array_combを作りたいと考えております。

これをarray_combine(入れ子方式)やarray_mapを使用して試行錯誤しているのですが、どうしてもうまくいきません。
何かsimpleに解決する方法はございませんでしょうか。

何卒、よろしくお願い申し上げます。

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

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

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

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

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

guest

回答3

0

PHP5.6以降限定

php

1$john_chunk = array_chunk($john, 3); // 3つずつに分割 2$values = array_map(null, $ted, $matt, ...$john_chunk); // 展開 3$result = array_combine($tom, $values);

5.5以前の環境で同じ事をしようとすると地味に面倒そう。
takasima20さんの方法が簡潔で分かりやすいと思います。

投稿2016/08/29 15:17

nnssn

総合スコア1221

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

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

SugiuraY

2016/08/29 15:36

ご回答ありがとうございます。上記のコードでもいけそうと思ったのですが john_chunk = array_chunk($john, 3);で3つずつに分割した場合、飛び石ではなく john_chunk [0]= array ([0]=>'000' [1]=>'111'); john_chunk [1]=array ([0]=>'222' [1]=> '333'); john_chunk [2]=array (0]=>'444' [1]=> '555'); になってしまいませんか?正しい分割の仕方は john_chunk [0]= array ([0]=>'000' [1]=>'333'); john_chunk [1]=array ([0]=>'111' [1]=> '444'); john_chunk [2]=array (0]=>'222' [1]=> '555'); になります。誤解をしていたら申し訳ございません。 よろしくお願い申し上げます。
nnssn

2016/08/29 15:59 編集

array_chunkで分割した場合飛び石にならないというのは 間違っていません。正しいです。 ただその後、...付きで引数をアンパックしているのがミソで これを別の書き方にするとこうなります。 array_map(null, $ted, $matt, $john_chunk[0], $john_chunk[1]) 3つずつに分割した多次元配列$john_chunkの子要素が各々別の引数 としてarray_mapに渡されているため結果的に、 1週目は元の$johnでいう0,3番目の要素が、2週目は2,5番目の要素が使われています。 ... による引数のアンパック http://jp2.php.net/manual/ja/migration56.new-features.php#migration56.new-features.splat
SugiuraY

2016/08/29 16:16

な、なるほど、アンパックという概念を初めて知りました。本当にまだまだ知らないことばかりで、そんなことができるのかと、都度に感心してばかりです!ちょっと明日、また早く起きて勉強します。有難うございました!
nnssn

2016/08/29 16:22

すみません、自分もSugiuraYさんのコメントの中で1点見落としている ところがあったみたいで。 john_chunkは要素数3でイメージされているようですが、要素数は2のはずです。 ”指定個数になるよう”に分割ではなく、”指定個数ずつ”分割です。
SugiuraY

2016/08/29 16:34

仰る通りですね、2要素 ずつ分割ですね。
guest

0

ベストアンサー

地味ですが…

PHP

1$array_comb = array(); 2for ($i=0; $i<count($tom); $i++) { 3 $array_comb[$tom[$i]] = array($ted[$i],$matt[$i],$john[$i],$john[$i+3]); 4}

投稿2016/08/29 14:51

takasima20

総合スコア7458

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

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

SugiuraY

2016/08/29 14:55

ご回答、誠に有難うございます。 やはり、その方法が結果的最もシンプルな方法になりますかね。。
guest

0

$ted, $matt, $johnに格納されている要素を、array_combの連想配列に紐づく配列に、順番にラウンドロビンで格納する処理と理解しました。
$ted, $matt, $johnの要素数に左右されない処理を考えてみました。(ただし、$tomの要素数の倍数であること)
$elementNamesに設定している配列名を変更することにより、$array_combに格納する順番を変更することもできます。

php

1<?php 2$tom = array('AAA', 'BBB', 'CCC'); 3$ted = array('aaa', 'bbb', 'ccc'); 4$matt = array('xxx', 'yyy', 'zzz'); 5$john = array('000', '111', '222', '333', '444', '555'); 6 7# array_combに格納する要素が格納されている配列名称一覧 8$elementNames = array('ted', 'matt', 'john'); 9 10# array_combに格納する要素を一つの配列にする 11$elements = array(); 12foreach($elementNames as $elementName) 13 $elements = array_merge($elements, $$elementName); 14 15# array_combの「枠」をまずは作成 16$array_comb = array(); 17foreach($tom as $key) 18 $array_comb[$key] = array(); 19 20# array_combに要素を格納 21for($i = 0; count($elements) > 0; $i++) 22 array_push($array_comb[$tom[$i % count($tom)]], array_shift($elements)); 23 # % は剰余(割算の余り)を求める。$tomの要素数が3の場合 0, 1, 2を繰り返す 24 # array_shift()は要素の先頭を取りだす。 25 # すなわち、AAA, BBB, CCCにラウンドロビンで$elementsの要素を先頭から格納 26 # $elementが空になったらループを抜ける。 27 28var_dump($array_comb); 29/* 30array(3) { 31 ["AAA"]=> 32 array(4) { 33 [0]=> 34 string(3) "aaa" 35 [1]=> 36 string(3) "xxx" 37 [2]=> 38 string(3) "000" 39 [3]=> 40 string(3) "333" 41 } 42 ["BBB"]=> 43 array(4) { 44 [0]=> 45 string(3) "bbb" 46 [1]=> 47 string(3) "yyy" 48 [2]=> 49 string(3) "111" 50 [3]=> 51 string(3) "444" 52 } 53 ["CCC"]=> 54 array(4) { 55 [0]=> 56 string(3) "ccc" 57 [1]=> 58 string(3) "zzz" 59 [2]=> 60 string(3) "222" 61 [3]=> 62 string(3) "555" 63 } 64} 65*/ 66?> 67

投稿2016/08/29 16:21

snowfaller

総合スコア125

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

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

SugiuraY

2016/08/29 16:40

ご回答頂き、有難うございます。 確かに実際、やろうとしていることは、配列の要素が一定ではないため、かなり汎用的な方法とお見受けいたします。本当に勉強になります。 重ねて深謝申し上げます。
snowfaller

2016/08/29 16:55

はい。汎用的な記述を心がけました。 例えば、mike { '+', '-', '=' }の要素を$tedと$mattの間に入れたければ、 $mike = array('+', '-', '='); を追記し、 $elementNames = array('ted', 'matt', 'john'); を $elementNames = array('ted', ’mike', 'matt', 'john'); に修正して下さい。
SugiuraY

2016/08/30 03:12

ご返信ありがとうございます。 理解をいたしました。早速今後のコーディングに活かしてまいりたいと思います。 よろしくお願い申しあげます。
snowfaller

2016/08/30 03:47

ちなみに $elements = array_merge($elements, $$elementName); の「$$elementName」は可変変数です。 $elementNameに設定された変数名の内容を表示します。 $A = 'ABC'; $elementName = 'A'; println($$elementName); で変数Aの内容'ABC'が表示されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問