У меня многомерный массив:
$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; } } }