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

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

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

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

Q&A

解決済

2回答

1202閲覧

PHPで配列の要素をまとめ上げて階層化した配列を作りたい。

fujiyan

総合スコア13

PHP

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

0グッド

0クリップ

投稿2018/10/29 09:30

編集2018/10/29 09:32

以下のような配列を重複したデータがあった場合に、label1label2の順に重複したデータを重ね、階層状にまとめ上げた新たな配列を作りたい(label3は一意なデータです)
どのように処理すれば良いでしょうか。

phpのバージョンは7.0です。

元々の配列

php

1 2$array = [ 3 0 => [ 4 'label1' => 'a1', 5 'label2' => 'b1', 6 'label3' => 'c1', 7 ], 8 1 => [ 9 'label1' => 'a1', 10 'label2' => 'b1', 11 'label3' => 'c2', 12 ] 13 2 => [ 14 'label1' => 'a2', 15 'label2' => 'b2', 16 'label3' => 'c3', 17 ] 18];

目的の配列

php

1 2$new_array = [ 3//label1、2の'a1','b1'は重複しているため、まとめ上げる。 4 'a1' => [ 5 'b1' => [ 6 'c1','c2', 7 ] 8 ] 9 ], 10 'a2' => [ 11 'b2' => 'c3', 12 ] 13 ] 14 ], 15];

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

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

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

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

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

seastar3

2018/10/29 09:54

常にlabel1,label2,label3が与えられるのでよいのですね。各階層ごとのソートも正しくできているのでしょうか
fujiyan

2018/10/29 10:35

ご確認頂きありがとうございます。ご質問頂いた条件は満たしております。
ssasaki

2018/10/29 10:44

3階層限定で良いのですか?また、cの層はまとめられていますが、aやbの層がまとめられることはないのですか?例えば、a2,b4,c3といったデータが出てきたりした場合です
fujiyan

2018/10/29 12:11

三層固定で良いです。label1、label2の順に重複したデータを重ねて配列化したいです。ご質問の答えになっておりますでしょうか。
guest

回答2

0

ベストアンサー

結局は地道にやるしかなさげ?なので、いくつか回答をまって自分が分かりやすい方法を選ぶくらい?

label3はユニークとのことなので、a2,b4,c3はあり得ないと理解しています。a2,b4,c4を入れてみました。

php

1<?php 2$array = [ 3 0 => [ 4 'label1' => 'a1', 5 'label2' => 'b1', 6 'label3' => 'c2', 7 ], 8 1 => [ 9 'label1' => 'a1', 10 'label2' => 'b1', 11 'label3' => 'c1', 12 ], 13 2 => [ 14 'label1' => 'a2', 15 'label2' => 'b2', 16 'label3' => 'c3', 17 ], 18 3 => [ 19 'label1' => 'a2', 20 'label2' => 'b4', 21 'label3' => 'c4', 22 ] 23]; 24// 仕様の明確化。$arrayはソートされている 25$l1 = array_column($array, 'label1'); 26$l2 = array_column($array, 'label2'); 27$l3 = array_column($array, 'label3'); 28array_multisort($array, $l1, $l2, $l3); 29 30//ここから回答 31$ret = []; 32$prev = ["","",""]; 33foreach($array as ['label1'=> $cur[0], 'label2'=> $cur[1], 'label3'=>$cur[2]]) { 34 if($cur[0] !== $prev[0]) { 35 $ret[$cur[0]] = [$cur[1] => [$cur[2]]]; 36 $prev = $cur; 37 continue; 38 } 39 if($cur[1] !== $prev[1]) { 40 $ret[$prev[0]][$cur[1]] = [$cur[2]]; 41 $prev = $cur; 42 continue; 43 } 44 if($cur[2] !== $prev[2]) { 45 $ret[$prev[0]][$prev[1]][] = $cur[2]; 46 $prev = $cur; 47 continue; 48 } 49} 50var_export($ret);

投稿2018/10/29 12:50

papinianus

総合スコア12705

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

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

0

三層固定で地道にやったらこんな感じスかね

PHP

1$tmp_array = array(); 2foreach ($array as $ar) { 3 if (!array_key_exists($ar['label1'], $tmp_array)) { 4 $tmp_array[$ar['label1']] = array(); 5 } 6 $tmp_array[$ar['label1']][] = $ar; 7} 8$new_array = array(); 9foreach ($tmp_array as $key=>$arrays) { 10 $tmp = array(); 11 foreach ($arrays as $ar) { 12 if (!array_key_exists($ar['label2'], $tmp)) { 13 $tmp[$ar['label2']] = array(); 14 } 15 $tmp[$ar['label2']][] = $ar['label3']; 16 } 17 $new_array[$key] = $tmp; 18} 19

投稿2018/10/29 10:59

takasima20

総合スコア7468

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

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

fujiyan

2018/10/29 12:13

ありがとうございます。確かに、目的の配列になりました。 もう少し、他の方の処理も見てみたいのでお待ちください。 ``` Array ( [a1] => Array ( [b1] => Array ( [0] => c1 [1] => c2 ) ) [a2] => Array ( [b2] => Array ( [0] => c3 ) ) ) ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問