プロが教えるわが家の防犯対策術!

表題の処理を行うにはどうしたら良いでしょうか。

例:
要素名がxである値を別の配列にいれる

input
(
[a] => aaa
[b] => Array
(
[x] => 1
[y] => 2
)

[c] => Array
(
[x] => 8
)
)

output
(
[0] => 1
[1] => 8
)

A 回答 (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のキャッシュの効果が高まり実行速度が速くなります。
実際に動かしてテストしていないのでもしかしたらタイプミスが含まれているかもしれません。
    • good
    • 0

重箱の隅を突っつくような話ですが、


array('x' => array('a' => 'AA', 'x' => 'XX'), 'y'=>'YY');
を入力とした場合は、何を返すんでしょうか。

この回答への補足

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

補足日時:2006/12/24 01:36
    • good
    • 0

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;
}
}
?>
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/24 01:07

再帰構造の反復化がなされていなくて申し訳ないですが以下のようなものはいかがでしょうか?


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);
}
}
}
のようになります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/24 01:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!