調べたけどなかなかわからなかったのでご教授いただければ幸いです。
やりたいことは、
例えばこのような配列$aがあります。
php
1$a = [ 2 ['1', '2'], 3 ['1', '2'], 4 ['1', '3'], 5 ['4', '5', '6'], 6 ['4', '7'] 7];
この配列$aの中のそれぞれの配列の中の数字は、左から順に親子の関係であると考えます。
また、重複している組み合わせは一つと考えます。
この$aの場合、「'1'」は「'2'」と「'3'」を子供に持ち、「'4'」は「'5'」「'7'」を子供に持ち、さらに「'5'」は「'6'」を子供に持っていると考えます。
この考えで、それぞれの値をキーにした新たな配列を生成したいです。
説明がわかりづらくて申し訳ないですが、この例でいうと下記のような配列$bを新たに生成したいです。
php
1$b = [ 2 '1' => [ 3 '2' => [], 4 '3' => [] 5 ], 6 '4' => [ 7 '5' => [ 8 '6' => [] 9 ], 10 '7' => [] 11 ] 12];
キーを動的に定義してしかも深さが未知なときどうすればよいのかわからず詰まってしまいました。
何卒アドバイスの程よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答5件
0
初心者ですが、再帰と eval を使わないという条件でやってみました。
PHP
1<?php 2$a = [ 3 ['1', '2'], 4 ['1', '2'], 5 ['1', '3'], 6 ['4', '5', '6'], 7 ['4', '7'] 8]; 9$output = []; 10foreach ($a as $row) { 11 $l = &$output; 12 foreach ($row as $item) { 13 if (!array_key_exists($item, $l)) { 14 $l[$item] = []; 15 } 16 $l = &$l[$item]; 17 } 18} 19print_r($output);
投稿2019/05/20 10:21
総合スコア0
0
おちゅかれしゃまでしゅー。
初めに、ちょっと方向修正しまちゅ。
えっと、今回紹介しゅるのは再帰をしないやり方でちゅ。
たまたま引っ張り出したコードが、再帰をちゅかっていないコードでちた。
ぽっくんのコードは何度何度もリファクタをちているのでいろんなバージョンがあるのでちゅ。
お見せしゅるのはかなり古いコードでちゅね。
まじゅ、このコードが出来上がった背景を説明するのでちゅが、
これは、ぽっくんが使っている汎用バリデーターの機能の一部なのでちゅ。
ぽっくんが昔やっていた仕事で、こういう要件がお客しゃんから上がってきたのでちゅ。
しょの時の設計者はとにかく「あれも出来ませんこれも出来ません」と言って
お客さんからの要望をかたっぱしから断ってしまう人だったのでちゅよ。
しょれでぽっくんはお客しゃんが可愛そうだったので、
こういう要望を簡単に実現できる、どんな要望が来ても簡単に答える事の出来るバリデーターをちゅくろうと思ったのでちゅね。
ぽっくんが考えた仕様は、
PHP
1$validator = [ 2 "hoge" => ["type" => "text", "min" => 0, "max" => 32, "required" => true], 3 , "test_%_%" => ["type" => "text", "min" => 5, "max" => 12, "required" => true], 4];
みたいなバリデーション定義をしゅると、name: test__ について、ルール通りのバリデーションをちてくれるものでちゅ。
プログラムで処理するには、当然こういうリクエストは
PHP
1$_POST = [ 2 "test_1_2" => "hoge" 3 , "test_1_2" => "hage" 4 , "test_1_3" => "baka" 5 , "test_4_5_6" => "otankonasu" 6 , "test_4_7" => "kutabare" 7];
こうなってくれていたほうがfoeachで回せて楽ちんでちゅよね。
Array ( [1] => Array ( [2] => hage [3] => baka ) [4] => Array ( [5] => Array ( [6] => otankonasu ) [7] => kutabare ) )
だから実装したのでちゅ。
で、これが第2期だったか第3期だったかのコードを切り出したものでちゅ。
(多分、動くでちゅ。)
PHP
1<?php 2function getRequestMultiArray($prefix, $posts) 3{ 4 $reqArray = array(); 5 foreach ($posts as $key => $req) 6 { 7 if (!preg_match("/\A{$prefix}_(\d+_)*\d+\z/u", $key)){ continue; } 8 $key = str_replace("{$prefix}_", "", $key); 9 $serial = explode("_", $key); 10 $cArray = &$reqArray; 11 for ($i = 0; $i < count($serial); $i++) 12 { 13 if ($i === count($serial) - 1) 14 { 15 $cArray[$serial[$i]] = $req; 16 } 17 else 18 { 19 if (!isset($cArray[$serial[$i]])) 20 { 21 $cArray[$serial[$i]] = array(); 22 } 23 } 24 $cArray = &$cArray[$serial[$i]]; 25 } 26 unset($cArray); 27 } 28 return $reqArray; 29} 30 31////////////////////////////////////////////////////////// 32 33$posts = [ 34 "test_1_2" => "hoge" 35 , "test_1_2" => "hage" 36 , "test_1_3" => "baka" 37 , "test_4_5_6" => "otankonasu" 38 , "test_4_7" => "kutabare" 39]; 40$prefix = "test"; 41$posts[$prefix] = getRequestMultiArray($prefix, $posts); 42 43print_r($posts[$prefix]);
こんな感じの配列がかえりまちゅ。
Array ( [1] => Array ( [2] => hage [3] => baka ) [4] => Array ( [5] => Array ( [6] => otankonasu ) [7] => kutabare ) )
結局ね、プログラムって社会の問題を解決するためにあるのでちゅよね。
なのに、コードを書く事こそが仕事だと思っているコーダさんたちは「そんなの馬鹿げてる、仕様を変えるべきだ」って言うんでちゅよねぇ。
象しゃんは一生懸命、上流を変えろって言ってまちたよねぇ。
いわもとしゃんって人も、仕様がおかちい仕様を変えろって言ってまちた。
動的に生成された複数の要素に、生成されたタイミングで処理を行いたい
本当に、頭がおかちいと思うでちゅ。コードが書けるのが偉いんじゃない、問題を解決できるのが偉いのでちゅよねぇ。
なお、今ぽっくんの使っているバリデーターのコードは遥かに洗練されていまちゅが、現状は社外秘になっているので内緒でちゅ。
投稿2019/05/20 12:24
退会済みユーザー
総合スコア0
退会済みユーザー
2019/05/20 12:36 編集
退会済みユーザー
2019/05/20 12:37
退会済みユーザー
2019/05/20 12:39
退会済みユーザー
2019/05/20 12:45
退会済みユーザー
2019/05/20 12:55
退会済みユーザー
2019/05/20 12:56
退会済みユーザー
2019/05/20 12:59
退会済みユーザー
2019/05/20 13:07
退会済みユーザー
2019/05/20 13:09
退会済みユーザー
2019/05/20 13:12
退会済みユーザー
2019/05/20 13:14
退会済みユーザー
2019/05/20 13:15
退会済みユーザー
2019/05/20 13:19
退会済みユーザー
2019/05/20 13:37
退会済みユーザー
2019/05/20 13:43
退会済みユーザー
2019/05/20 13:44
退会済みユーザー
2019/05/20 13:48
退会済みユーザー
2019/05/20 14:13
退会済みユーザー
2019/05/20 14:15
0
ベストアンサー
<?php $tabemono=[ ['1', '2'], ['1', '2'], ['1', '3'], ['4', '5', '6'], ['4', '7'] ]; $dekiagari=[]; foreach($tabemono as $row){ $dekiagari = shokaki($row, $dekiagari); } print_r($dekiagari); function shokaki($input, $default=[]){ $unchi=$default; $k = array_shift($input); if(is_null($k))return []; if(isset($unchi[$k])){ $unchi[$k] = shokaki($input, $unchi[$k]); }else{ if(empty($input)){ $unchi[$k] = []; }else{ $unchi[$k] = shokaki($input); } } return $unchi; }
投稿2019/05/19 20:21
総合スコア6434
退会済みユーザー
2019/05/20 11:38
退会済みユーザー
2019/05/20 12:07
退会済みユーザー
2019/05/20 12:15
退会済みユーザー
2019/05/20 12:30
退会済みユーザー
2019/05/20 12:34
2019/05/20 17:12 編集
0
うんーと、昔、再帰を使って実現したでちゅ。
かなりめんどくさかったでちゅよ。
ぢぶんでやってみまちゅか? コード見たいでちゅか?
他の大人の人たちがどんな回答ちゅるか楽ちみなのでちょっと観察するでちゅ。
投稿2019/05/18 22:53
編集2019/05/18 22:55退会済みユーザー
総合スコア0
退会済みユーザー
2019/05/18 22:56
退会済みユーザー
2019/05/19 00:54 編集
退会済みユーザー
2019/05/19 01:16
退会済みユーザー
2019/05/19 01:24
退会済みユーザー
2019/05/19 01:25
退会済みユーザー
2019/05/19 06:51
0
普通にやるとめんどいね^^;
あまりオススメでないけど簡単なやつ
php
1<?php 2$a = [ 3 ['1', '2'], 4 ['1', '2'], 5 ['1', '3'], 6 ['4', '5', '6'], 7 ['4', '7'] 8]; 9 10foreach($a as $arr){ 11 $tmp_str = ""; 12 foreach ($arr as $val){ 13 $tmp_str .= '['.$val.']'; 14 } 15 $tmp_str = '$result'.$tmp_str.'=[];'; 16 eval($tmp_str); 17} 18var_export($result);
投稿2019/05/19 01:13
退会済みユーザー
総合スコア0
退会済みユーザー
2019/05/19 01:19
退会済みユーザー
2019/05/19 01:31
退会済みユーザー
2019/05/19 01:36
退会済みユーザー
2019/05/19 01:37
退会済みユーザー
2019/05/19 23:49
退会済みユーザー
2019/05/20 03:36 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。

退会済みユーザー
2019/05/20 11:37
2019/05/20 12:07
退会済みユーザー
2019/05/20 12:15
退会済みユーザー
2019/05/20 12:35
2019/05/20 12:38
退会済みユーザー
2019/05/20 12:39
退会済みユーザー
2019/05/20 12:40
退会済みユーザー
2019/05/20 12:40
2019/05/20 12:41
退会済みユーザー
2019/05/20 12:43 編集
2019/05/20 12:44
退会済みユーザー
2019/05/20 12:45
2019/05/20 12:47
退会済みユーザー
2019/05/20 12:48
2019/05/20 12:49
2019/05/20 12:49
2019/05/20 12:50
退会済みユーザー
2019/05/20 12:53
退会済みユーザー
2019/05/20 12:54
2019/05/20 12:54
退会済みユーザー
2019/05/20 12:58 編集
退会済みユーザー
2019/05/20 12:58
2019/05/20 12:59
退会済みユーザー
2019/05/20 13:02
2019/05/20 13:02
退会済みユーザー
2019/05/20 13:04
退会済みユーザー
2019/05/20 13:05
2019/05/20 13:05
退会済みユーザー
2019/05/20 13:08
退会済みユーザー
2019/05/20 13:08
2019/05/20 13:08
退会済みユーザー
2019/05/20 13:09
退会済みユーザー
2019/05/20 13:09
退会済みユーザー
2019/05/20 13:10
2019/05/20 13:11
退会済みユーザー
2019/05/20 13:14
退会済みユーザー
2019/05/20 13:15
2019/05/20 13:15
退会済みユーザー
2019/05/20 13:15
退会済みユーザー
2019/05/20 13:15
2019/05/20 13:15
退会済みユーザー
2019/05/20 13:16
退会済みユーザー
2019/05/20 13:17
2019/05/20 13:18
退会済みユーザー
2019/05/20 13:21
2019/05/20 13:21
退会済みユーザー
2019/05/20 13:22
2019/05/20 13:23
退会済みユーザー
2019/05/20 13:23
退会済みユーザー
2019/05/20 13:24
退会済みユーザー
2019/05/20 13:24
退会済みユーザー
2019/05/20 13:25
退会済みユーザー
2019/05/20 13:26
2019/05/20 13:26
退会済みユーザー
2019/05/20 13:27
退会済みユーザー
2019/05/20 13:27
2019/05/20 13:29
退会済みユーザー
2019/05/20 13:29
2019/05/20 13:29
退会済みユーザー
2019/05/20 13:29
2019/05/20 13:30
2019/05/20 13:30
退会済みユーザー
2019/05/20 13:32
2019/05/20 13:33
退会済みユーザー
2019/05/20 13:33
2019/05/20 13:34
退会済みユーザー
2019/05/20 13:35
2019/05/20 13:36
退会済みユーザー
2019/05/20 13:40
退会済みユーザー
2019/05/20 13:41
退会済みユーザー
2019/05/20 13:41
退会済みユーザー
2019/05/20 13:42
2019/05/20 13:43
退会済みユーザー
2019/05/20 13:45
退会済みユーザー
2019/05/20 13:46
退会済みユーザー
2019/05/20 13:47
2019/05/20 13:47
退会済みユーザー
2019/05/20 13:49
退会済みユーザー
2019/05/20 13:49
2019/05/20 13:49
退会済みユーザー
2019/05/20 13:50
2019/05/20 13:51
退会済みユーザー
2019/05/20 13:51
退会済みユーザー
2019/05/20 13:51
退会済みユーザー
2019/05/20 13:53
退会済みユーザー
2019/05/20 13:57 編集
2019/05/20 13:57
退会済みユーザー
2019/05/20 13:59
2019/05/20 14:00
退会済みユーザー
2019/05/20 14:02
2019/05/20 14:03
退会済みユーザー
2019/05/20 14:03
2019/05/20 14:03
退会済みユーザー
2019/05/20 14:03
退会済みユーザー
2019/05/20 14:04
2019/05/20 14:05
退会済みユーザー
2019/05/20 14:06
2019/05/20 14:07
退会済みユーザー
2019/05/20 14:08
退会済みユーザー
2019/05/20 14:08 編集
退会済みユーザー
2019/05/20 14:08
2019/05/20 14:09
退会済みユーザー
2019/05/20 14:10
退会済みユーザー
2019/05/20 14:10
退会済みユーザー
2019/05/20 14:11
2019/05/20 14:13
退会済みユーザー
2019/05/20 14:14
退会済みユーザー
2019/05/20 14:14
退会済みユーザー
2019/05/20 14:16
2019/05/20 14:18
2019/05/20 14:18
退会済みユーザー
2019/05/20 14:18
退会済みユーザー
2019/05/20 14:20 編集