私の質問はSearching for an array key branch inside a large array tree - PHPに似ていますが、さまざまな制限 (オンザフライの処理など) と、知識のために PHP 再帰だけを使用して実装したいと思います。
次のデータを検討してください。
array(
'root_trrreeee1' => array(
'path1' => array(
'description' => 'etc',
'child_of_path_1' => array(
array('name' => '1'),
array('name' => '1')
)
),
'path1' => array(
'description' => 'etc',
'child_of_path_1' => array(
array('name' => '1'),
array('name' => '1')
)
),
),
'name' => '1',
1 => array('name' => '1'),
'another_leaf' => '1'
)
検索するarray('name' => '1')
と、その値に到達するためにトラバースする必要があるパスroot_trrreeee1.path1.child_of_path_1.o
が返され、できれば配列として返されます。
array(
0 => root_trrreeee1
1 => path1
2 => child_of_path_1
3 => 0
)
これは私が実装しようとした再帰関数ですが、動作しません:
function multidimensional_preserv_key_search($haystack, $needle, $path = array(), &$true_path = array())
{
if (empty($needle) || empty($haystack)) {
return false;
}
foreach ($haystack as $key => $value) {
foreach ($needle as $skey => $svalue) {
if (is_array($value)) {
$path = multidimensional_preserv_key_search($value, $needle, array($key => $path), $true_path);
}
if (($value === $svalue) && ($key === $skey)) {
$true_path = $path;
return $true_path;
}
}
}
if (is_array($true_path)) { return array_reverse(flatten_keys($true_path)); }
return $path;
}
function flatten_keys($array)
{
$result = array();
foreach($array as $key => $value) {
if(is_array($value)) {
$result[] = $key;
$result = array_merge($result, self::flatten_keys($value));
} else {
$result[] = $key;
}
}
return $result;
}
空の配列だけを返します。前もって感謝します。
私が見つけた同様の質問: