Рекурсивный поиск по массиву с правильной индексацией

Я пытаюсь создать функцию, которая позволит мне найти свой путь через сложную иерархическую структуру.

Например, учитывая этот массив:

$arr=array("name"=>"NameA","children"=>array());
$arr["children"][]=array("name"=>"NameB","size"=>"38");
$arr["children"][]=array("name"=>"NameC","children"=>array("name"=>'NameD',"children"=>array()));

Я хотел бы найти полный путь к ключу для данного имени. Например, поиск NameC вернется $a=array('children',1) а также NameD вернется $a=array('children',1,'children'), Это позволило бы мне получить NameD с $arr['children'][1]['children']['name'] или же $arr[$a[0]][$a[1]][$a[2]]['name'],

Я экспериментировал с вызовами этой функции на каждом уровне:

function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
return $current_key;
}
}
return false;
}

Но recursive_array_search('NameC') возвращается 'children' вместо того, чтобы возвращать 1. Я попытался изменить это несколькими способами, но безрезультатно.

Обратите внимание, что я не могу изменить структуру исходного массива, потому что я использую это для создания массива JSON, который должен иметь эту структуру.

Любая помощь будет оценена.

1

Решение

Я собираю путь в массиве

function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
// found - create array and put lower key
if($needle===$value) return(array($key));
if (is_array($value) && ($ret = recursive_array_search($needle,$value)) !== false)
// add current key as 1st item in array
{ array_unshift($ret, $key); return $ret; }
}
return false;
}

Так, recursive_array_search('NameD',$arr) вернуть:

 Array (
[0] => children
[1] => 1
[2] => children
[3] => name
)
1

Другие решения

Других решений пока нет …