Intereting Posts
Что такое шаблон регулярного выражения для datetime (2008-09-01 12:35:45)? Метод PHP post, по-видимому, не работает CakePHP: нумерованные разбитые на результат результаты Запрос Ajax в среде prod вызывает отказ в доступе (пользователь не прошел полную проверку подлинности) Слова после вопросительного знака отсутствуют при нажатии кнопки, чтобы открыть ссылку Создайте логин и сохраните пользователя imput в текстовом файле, используя php Почему вызовы функций PHP * так дорого? GLOBAL Array удаляется … – WP All Import function.php – Php7.1 Неустранимая ошибка: оператор не поддерживается для строк Могу ли я перебирать две петли равного размера с помощью foreach? JSON.parse: неожиданный символ в строке 1 столбца 1 данных JSON (php) php объединяет 2 массива в один ассоциативный массив Найти количество открытых сеансов Мониторинг изменений в базе данных с помощью AJAX и PHP Есть ли способ отключить добавление свойств в класс из экземпляра класса?

Как найти последнее появление «иглы» в массиве php

Существует встроенная функция для поиска ключа массива для значения – 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]; } } } 

Я бы предпочел что-то получше.

Related of "Как найти последнее появление «иглы» в массиве php"

 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' // )