- ベストアンサー
多次元配列の中で条件に合う要素の値を全て別の配列に入れるには
表題の処理を行うにはどうしたら良いでしょうか。 例: 要素名がxである値を別の配列にいれる input ( [a] => aaa [b] => Array ( [x] => 1 [y] => 2 ) [c] => Array ( [x] => 8 ) ) output ( [0] => 1 [1] => 8 )
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>$outputはグローバルで参照するのでしょうか? ごめんなさい。 return $output; を忘れていました。 >arrayを除く値ということで。 だそうですので function KeySearch ($input, $SearchKey) { while ($key = key ($input)) { if (is_array ($input[$key])) { $output[] = KeySearch ($input[$key], $SearchKey); } else if ($key == $SearchKey) { $output[] = input[$key]; } } return $outpu; } で目的のものが取得できます。 再起構造の反復化をすると以下のようになります。 function KeySearch ($input, $SearchKey) { $i = 0; $temp[$i] = $input; while ($i >= 0) { while ($key = key ($temp[$i])) { if (is_array ($temp[$i][$key])) { $temp[$i+1][$key] = $temp[$i][$key]; $i++; } else if ($key == $SearchKey) { $output[] = $temp[$i][$key]; } } $i--; } return $outpu; } こうすることでメモリの局所性が高まりCPUのキャッシュの効果が高まり実行速度が速くなります。 実際に動かしてテストしていないのでもしかしたらタイプミスが含まれているかもしれません。
その他の回答 (3)
- fdsjaklfjas
- ベストアンサー率81% (96/118)
重箱の隅を突っつくような話ですが、 array('x' => array('a' => 'AA', 'x' => 'XX'), 'y'=>'YY'); を入力とした場合は、何を返すんでしょうか。
- yambejp
- ベストアンサー率51% (3827/7415)
PHP5には再起処理のwalkができるようですけど PHP4系ならこんな感じでいかがですか? <?PHP $orgArray=Array('a'=>'aaa','b' => Array('x'=>1,'y'=>2,'z'=>Array('x'=>10,'y'=>20)),'c'=>Array('x'=>8),'d'=>Array('y'=>9)); arrayKeySearchRecursive("x",$orgArray,$xArray); //xがキーの配列を返す print_r($xArray); arrayKeySearchRecursive("y",$orgArray,$yArray);//yがキーの配列を返す print_r($yArray); function arrayKeySearchRecursive($keyStr,$org,&$new) { foreach($org as $k=>$v ) { if(is_array($v)) arrayKeySearchRecursive($keyStr,$v,$new) ; else if($k==$keyStr) $new[]=$v; } } ?>
お礼
ありがとうございます。 再帰処理を理解しておらずどう実装すれば良いか分かりませんでして、大変参考になるとともに勉強になりました。
- izayoimizuki
- ベストアンサー率41% (84/202)
再帰構造の反復化がなされていなくて申し訳ないですが以下のようなものはいかがでしょうか? function KeySearch ($input, $SearchKey) { while ($key = key ($input)) { if ($key == $SearchKey) { $output[] = input[$key]; } else if (is_array ($input[$key])) { $output[] = KeySearch ($input[$key], $SearchKey); } } } 抽出されたキーの中身の一致する要素も別に取り出したければ function KeySearch ($input, $SearchKey) { while ($key = key ($input)) { if ($key == $SearchKey) { $output[] = input[$key]; } if (is_array ($input[$key])) { $output[] = KeySearch ($input[$key], $SearchKey); } } } のようになります。
お礼
ありがとうございます。 $outputはグローバルで参照するのでしょうか?
補足
arrayを除く値ということで。