Рекурсивный массив_поиск

У меня многомерный массив:

$categories = array( array( 'CategoryID' => 14308, 'CategoryLevel' => 1, 'CategoryName' => 'Alcohol & Food', 'CategoryParentID' => 14308 ), // CHILD CATEGORIES array( array( 'CategoryID' => 179836, 'CategoryLevel' => 2, 'CategoryName' => 'Alcohol & Alcohol Mixes', 'CategoryParentID' => 14308 ), array( array( 'CategoryID' => 172528, 'CategoryLevel' => 2, 'CategoryName' => 'Antipasto, Savoury', 'CategoryParentID' => 14308 ) ) ) ); 

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

 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; } 

.. но он также возвращает только ключ первого массива:

 echo recursive_array_search(172528, $categories); // outputs 1 

Я ожидаю:

 [1][1][0] 

Вы можете изменить свою рекурсивную функцию, как это, что должно дать вам решение:

 function recursive_array_search($needle, $haystack, $currentKey = '') { foreach($haystack as $key=>$value) { if (is_array($value)) { $nextKey = recursive_array_search($needle,$value, $currentKey . '[' . $key . ']'); if ($nextKey) { return $nextKey; } } else if($value==$needle) { return is_numeric($key) ? $currentKey . '[' .$key . ']' : $currentKey . '["' .$key . '"]'; } } return false; } 

Это приведет к

 [1][1][0]["CategoryID"] 

Поскольку CategoryID также является ключом к вашему многомерному массиву.

Если вы этого не хотите, вы можете адаптировать функцию к

 function recursive_array_search($needle, $haystack, $currentKey = '') { foreach($haystack as $key=>$value) { if (is_array($value)) { $nextKey = recursive_array_search($needle,$value, $currentKey . '[' . $key . ']'); if ($nextKey) { return $nextKey; } } else if($value==$needle) { return is_numeric($key) ? $currentKey . '[' .$key . ']' : $currentKey; } } return false; } 

Вы игнорируете возвращаемое значение вашего внутреннего вызова для recursive_array_search . Не делай этого.

 /* * Searches for $needle in the multidimensional array $haystack. * * @param mixed $needle The item to search for * @param array $haystack The array to search * @return array|bool The indices of $needle in $haystack across the * various dimensions. FALSE if $needle was not found. */ function recursive_array_search($needle,$haystack) { foreach($haystack as $key=>$value) { if($needle===$value) { return array($key); } else if (is_array($value) && $subkey = recursive_array_search($needle,$value)) { array_unshift($subkey, $key); return $subkey; } } }