• ベストアンサー

多次元配列の中で条件に合う要素の値を全て別の配列に入れるには

表題の処理を行うにはどうしたら良いでしょうか。 例: 要素名がxである値を別の配列にいれる input ( [a] => aaa [b] => Array ( [x] => 1 [y] => 2 ) [c] => Array ( [x] => 8 ) ) output ( [0] => 1 [1] => 8 )

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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)

回答No.3

重箱の隅を突っつくような話ですが、 array('x' => array('a' => 'AA', 'x' => 'XX'), 'y'=>'YY'); を入力とした場合は、何を返すんでしょうか。

ton_jiru
質問者

補足

arrayを除く値ということで。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

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; } } ?>

ton_jiru
質問者

お礼

ありがとうございます。 再帰処理を理解しておらずどう実装すれば良いか分かりませんでして、大変参考になるとともに勉強になりました。

回答No.1

再帰構造の反復化がなされていなくて申し訳ないですが以下のようなものはいかがでしょうか? 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); } } } のようになります。

ton_jiru
質問者

お礼

ありがとうございます。 $outputはグローバルで参照するのでしょうか?

関連するQ&A