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のキャッシュの効果が高まり実行速度が速くなります。
実際に動かしてテストしていないのでもしかしたらタイプミスが含まれているかもしれません。
No.3
- 回答日時:
重箱の隅を突っつくような話ですが、
array('x' => array('a' => 'AA', 'x' => 'XX'), 'y'=>'YY');
を入力とした場合は、何を返すんでしょうか。
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;
}
}
?>
この回答へのお礼
お礼日時:2006/12/24 01:07
ありがとうございます。
再帰処理を理解しておらずどう実装すれば良いか分かりませんでして、大変参考になるとともに勉強になりました。
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);
}
}
}
のようになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPでこのコード自体に意味は無...
-
PHPで連想配列のプルダウンメニ...
-
連想配列のキー値(連番)を基...
-
PHPの構文で間違えが分からない
-
foreachで上限回数指定方法また...
-
新大阪・梅田周辺でチェックア...
-
foreachとかの勝手な省略?
-
プログラミングのPythonのnoteb...
-
PHPのカッコ[ ]の使い方について
-
スカラーのベクトル微分
-
ヒアドキュメントの中のfor文
-
複数行のデータのPOST処理に関して
-
エラーメッセージ(無効な間接...
-
fgetsで取り込んだ文字をexplod...
-
forとかで連番の変数を一気に格...
-
foreachのなかで次のキーを参照...
-
String だと「 ByRef引数の型が...
-
fgetcsvでデータが何も表示され...
-
PHPで配列をPOSTデータで送った...
-
配列を回すとき、最後の要素だ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マッチング処理(1:N)
-
smartyのforeachの使い方
-
foreachで上限回数指定方法また...
-
多次元配列を、1次元の配列にす...
-
foreachの間にテーブルの<TR>を...
-
PHP、{}記号の意味
-
$_POST受信で必要項目のみを結...
-
3つの連想配列を交互に代入し...
-
VB.NET で 二次元のハッシュは...
-
PHP:ツリー構造をulとli要素に...
-
foreachで配列を、左から縦3列...
-
PHPの構文で間違えが分からない
-
PHPで連想配列のプルダウンメニ...
-
添え字が全て文字列のPHPの多次...
-
POSTで渡されるデータの数がわ...
-
テーブルデータ表示
-
Smartyでインクリメント
-
PHPで変数名にハイフンを使うに...
-
Delphi XEの警告文を消したい
-
配列から順位を算出したい
おすすめ情報