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

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

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

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

Q&A

解決済

1回答

2522閲覧

階層構造になった連想配列を値ごとにまとめたい

light

総合スコア17

PHP

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

0グッド

0クリップ

投稿2014/12/21 15:26

array(1) {
["key"]=>
array(2) {
[0]=>
array(2) {
["ka1"]=>
string(6) "groupa"
[0]=>
array(2) {
["ka2"]=>
string(3) "va2"
["ka3"]=>
string(3) "va3"
}
}
[1]=>
array(2) {
["kb1"]=>
string(6) "groupb"
[0]=>
array(2) {
["kb2"]=>
string(3) "vb2"
["kb3"]=>
string(3) "vb3"
}
}
[2]=>
array(2) {
["kc1"]=>
string(6) "broupa"
[0]=>
array(2) {
["kc2"]=>
string(3) "vc2"
["kc3"]=>
string(3) "vc3"
}
}
[3]=>
array(2) {
["kd1"]=>
string(6) "groupb"
[0]=>
array(2) {
["kd2"]=>
string(3) "vd2"
["kd3"]=>
string(3) "vd3"
}
}
}
}

といった具合のちょっと面倒な感じの階層構造になった連想配列があり、これを

array(1) {
["key"]=>
array(2) {
[0]=>
array(2) {
["ka1"]=>
string(6) "groupa"
[0]=>
array(2) {
["ka2"]=>
string(3) "va2"
["ka3"]=>
string(3) "va3"
}
[1]=>
array(2) {
["kc2"]=>
string(3) "vc2"
["kc3"]=>
string(3) "vc3"
}
}
[1]=>
array(2) {
["kb1"]=>
string(6) "groupb"
[0]=>
array(2) {
["kb2"]=>
string(3) "vb2"
["kb3"]=>
string(3) "vb3"
}
[1]=>
array(2) {
["kd2"]=>
string(3) "vd2"
["kd3"]=>
string(3) "vd3"
}
}
}
}

といった具合に値(groupa,groupb)ごとにまとめたいのですがうまくいきません。
いい方法はありませんでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答ではないですが、質問はもう少し回答しやすい形式で書いたほうがいいです。

  • データは var_dump だとコピペですぐ試せないので php のコードとして書く
  • コードブロック&シンタックスハイライトが有効になるように記述する

lang

1<?php 2$a = array( 3 "key" => array( 4 0 => array( 5 "ka1" => "groupa", 6 0 => array( 7 "ka2" => "va2", 8 "ka3" => "va3", 9 ), 10 ), 11 1 => array( 12 "kb1" => "groupb", 13 0 => array( 14 "kb2" => "vb2", 15 "kb3" => "vb3", 16 ), 17 ), 18 2 => array( 19 "kc1" => "groupa", 20 0 => array( 21 "kc2" => "vc2", 22 "kc3" => "vc3", 23 ), 24 ), 25 3 => array( 26 "kd1" => "groupb", 27 0 => array( 28 "kd2" => "vd2", 29 "kd3" => "vd3", 30 ), 31 ), 32 ), 33);

といった具合のちょっと面倒な感じの階層構造になった連想配列があり、これを

lang

1$a = array( 2 "key" => array( 3 0 => array( 4 "ka1" => "groupa", 5 0 => array( 6 "ka2" => "va2", 7 "ka3" => "va3", 8 ), 9 1 => array( 10 "kc2" => "vc2", 11 "kc3" => "vc3", 12 ), 13 ), 14 1 => array( 15 "kb1" => "groupb", 16 0 => array( 17 "kb2" => "vb2", 18 "kb3" => "vb3", 19 ), 20 1 => array( 21 "kd2" => "vd2", 22 "kd3" => "vd3", 23 ) 24 ), 25 ), 26);

といった具合に値(groupa,groupb)ごとにまとめたいのですがうまくいきません。
いい方法はありませんでしょうか。

回答

こんなかんじでしょうか。

lang

1<?php 2$a = array( 3 "key" => array( 4 0 => array( 5 "ka1" => "groupa", 6 0 => array( 7 "ka2" => "va2", 8 "ka3" => "va3", 9 ), 10 ), 11 1 => array( 12 "kb1" => "groupb", 13 0 => array( 14 "kb2" => "vb2", 15 "kb3" => "vb3", 16 ), 17 ), 18 2 => array( 19 "kc1" => "groupa", 20 0 => array( 21 "kc2" => "vc2", 22 "kc3" => "vc3", 23 ), 24 ), 25 3 => array( 26 "kd1" => "groupb", 27 0 => array( 28 "kd2" => "vd2", 29 "kd3" => "vd3", 30 ), 31 ), 32 ), 33); 34 35$ret['key'] = array_values(array_reduce($a["key"], function ($r, $a) { 36 //$group = array_values($a)[0]; 37 $group = reset($a); 38 if (isset($r[$group]) == false) { 39 $r[$group] = $a; 40 } else { 41 $r[$group] = array_merge($r[$group], array_slice($a, 1)); 42 } 43 return $r; 44}, [])); 45 46$chk = array( 47 "key" => array( 48 0 => array( 49 "ka1" => "groupa", 50 0 => array( 51 "ka2" => "va2", 52 "ka3" => "va3", 53 ), 54 1 => array( 55 "kc2" => "vc2", 56 "kc3" => "vc3", 57 ), 58 ), 59 1 => array( 60 "kb1" => "groupb", 61 0 => array( 62 "kb2" => "vb2", 63 "kb3" => "vb3", 64 ), 65 1 => array( 66 "kd2" => "vd2", 67 "kd3" => "vd3", 68 ) 69 ), 70 ), 71); 72 73var_dump($ret === $chk); // bool(true)

投稿2014/12/21 16:14

ngyuki

総合スコア4514

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

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

light

2014/12/22 08:25

ご丁寧にアドバイスありがとうございます。 ご提示いただいたコードのほうも要求通りの出力をしてくれました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問