Я пытаюсь создать функцию, которая позволит мне найти свой путь через сложную иерархическую структуру.
Например, учитывая этот массив:
$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, который должен иметь эту структуру.
Любая помощь будет оценена.
Я собираю путь в массиве
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
)
Других решений пока нет …