Существует встроенная функция для поиска ключа массива для значения – array_search
. Однако, как видно из примера, функция только находит первое вхождение, тогда как мне нужно последнее:
<?php $array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red'); $key = array_search('green', $array); // $key = 2; $key = array_search('red', $array); // $key = 1; ?>
Есть ли встроенная функция для этого?
Если нет, могу ли я сделать foreach
обратном направлении (от последнего ключа до первого)?
Если все ответы отрицательные, я думаю, это единственное решение:
function array_search_last($needle, $array, $strict = false) { $keys = array_keys($array); //Not sure how smart PHP is, so I'm trying to avoid IF for every iteration if($strict) { for($i=count($keys)-1; $i>=0; $i--) { //strict search if($array[$keys[$i]]===$needle) return $keys[$i]; } } else { for($i=count($keys)-1; $i>=0; $i--) { //benevolent search if($array[$keys[$i]]==$needle) return $keys[$i]; } } }
Я бы предпочел что-то получше.
array_search('green', array_reverse($array));
Сначала переверните его, затем выполните поиск
Но все они пропустили одну вещь, которая привела бы к неправильным результатам для необходимости OP, он ищет индекс последнего элемента, а реверсивный массив вызовет переиндексацию ключей (когда числовое), поэтому окончательное решение – установить параметр preserve_keys
в TRUE
см. Документы :
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red'); $reversed = array_reverse($array, true); echo array_search('red', $reversed); // outs 3
Вот более общее решение, которое работает для многомерных ассоциативных массивов. Он находит все соответствующие значения для определенного столбца:
$needle = array(0 => 'name_2'); $haystack = array( 23 => array( 'id' => '23', 'name' => 'name_1' ), 'arr' => array( 'id' => 'arr', 'name' => 'name_2' ), 'arrss' => array( 'id' => 'arrss', 'name' => 'name_2' ) ); $haystack_name = array_column($haystack, 'name', 'id'); // array( // '23' => 'name_1', // 'arr' => 'name_2' // 'arrss' => 'name_2' // ) $name_matches = array_intersect($haystack_name, $needle); // array( // 'arr' => 'name_2' // 'arrss' => 'name_2' // ) $matches = array_intersect_key($haystack, $name_matches); // array( // 'arr' => array( // 'id' => 'arr', // 'name' => 'name_2' // ), // 'arrss' => array( // 'id' => 'arrss', // 'name' => 'name_2' // ) // ) $last_value = $matches[count($matches) - 1]; // array( // 'id' => 'arrss', // 'name' => 'name_2' // )