PHP поиск многомерных массивов по значению
Вызов функции search_by_uid(100) (uid первого пользователя) должен возвращать 0 . Вызов функции search_by_uid(40489) должен возвращать 2 . Я пробовал создавать циклы, но мне нужен более быстрый исполняемый код.
Я написал скрипт для проверки производительности нескольких ответов. Он генерирует массив массивов из 500 000 членов и ищет в нем значение в последнем члене. Я сравнил функцию, подобную принятому ответу, с двумя однострочными ответами array_column . Я изменил их все, чтобы вернуть фактический обнаруженный массив, а не только ключ, потому что обычно это мой вариант использования. Метод функции набрал 0,361, столбец поиска 0,184 и ключ-столбец 0,189, средняя микро-задержка более 1000 запусков для каждого метода.
18 ответов
function searchForId($id, $array) < foreach ($array as $key =>$val) < if ($val['uid'] === $id) < return $key; >> return null; >
Это сработает. Вы должны называть это следующим образом:
$id = searchForId('100', $userdb);
Важно знать, что если вы используете === , то сравниваемые типы должны быть точно такими же, в этом примере вам нужно искать string или просто использовать == вместо === .
На основе ответа angoru. В более поздних версиях PHP ( >= 5.5.0 ) вы можете использовать один-лайнер.
$key = array_search('100', array_column($userdb, 'uid'));
Вы также должны быть в состоянии сделать это без PHP 5.5 в одной строке, используя array_map вместо array_column. Просто замените array_column($userdb, ‘uid’) на array_map(function($v)
@angoru Я думаю, что оригинальное решение (цикл foreach ) будет работать быстрее, потому что оно останавливается, как только найдено совпадение. Более новое решение должно выполнить итерацию по всему массиву один раз, чтобы извлечь array_column , а затем повторить его во второй раз, чтобы выполнить поиск (пока он не найдет совпадение). Более новое решение легче читать, оно более лаконично, но OP специально поднял вопрос производительности.
@ JakubTruneček. Я имею какое-то отношение к тому же массиву, указанному в вопросе. Я хочу имя пользователя из массива, передавая идентификатор. Функция findUserName (40489) должна возвращать ‘Michael’. Как это возможно?
@ JakubTruneček Привет! Я столкнулся с этой проблемой в своем коде, но у меня совсем другое дело. В моем случае значение ‘uid’ присутствует несколько раз, поэтому мне нужно получить массивы основанного ключа.
Спасибо @ JakubTruneček. Ваше решение работает на соответствие строки тоже, поэтому мне нравится ваше решение.
если предположить, что я хочу найти комбинацию uid = 100 И имя = Сандра Шуш. Что я могу сделать @Jakub Truneček
Имейте в виду, что однострочный ответ не будет работать, если ваши ключи массива не 0, 1, 2, 3, n (числовые и в порядке, начинающемся с нуля), потому что использование array_column сбросит ключи.
@BalakumarB. Просто добавьте $val[‘uid’] === $id && $val’name’] == ‘Sandra Shush’ . не забудьте передать параметр $name в функцию
Если вы используете (PHP 5 >= 5.5.0), вам не нужно писать свою собственную функцию, чтобы сделать это, просто напишите эту строку и все сделайте.
Если вы хотите получить только один результат:
$key = array_search(40489, array_column($userdb, 'uid'));
Для нескольких результатов
$keys = array_keys(array_column($userdb, 'uid'), 40489);
Если у вас есть ассоциативный массив, как указано в комментариях, вы можете сделать это с помощью
$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489);
Обновление: я делаю несколько простых тестов, и форма с несколькими результатами, кажется, самая быстрая, даже быстрее, чем пользовательская функция Jakub!
что если значение, которое я ищу (в данном примере — 40489), появляется более одного раза, и я хочу получить все ключи, которые появляются?
Это не сработало для меня, когда ключ в $ userdb не начинался с 0,1, 2 и т. Д., И говорил, что ключ равен 1234,4566 и т. Д. Результирующие ключи после array_search всегда равны 0,1,2 и т. Д. на
Это не будет работать с ассоциативным массивом, однако вы можете обойти это примерно так: array_search(40489, array_combine(array_keys($userdb), array_column($userdb, ‘uid’)))
@TarangP Я тестировал на PHP7.022, и он работал для меня, можете ли вы сказать мне, какой из них не удается?
спасибо @angoru Я действительно решил свою проблему, используя второй метод для проверки нескольких ключей с помощью этого кода $keys = array_keys(array_column($userdb, ‘uid’), 40489);
hii @angoru У меня есть одна проблема, это работает только для одного слова, но это не работает для сравнения строк. Это всегда соответствует одному слову, так что это неправильно в моем сценарии.
Создание Jakub отличный ответ, вот более обобщенный поиск, который позволит указать ключ (а не только для uid):
function searcharray($value, $key, $array) < foreach ($array as $k =>$val) < if ($val[$key] == $value) < return $k; >> return null; >
Использование: $results = searcharray(‘searchvalue’, searchkey, $array);
Это очень полезно, я чувствую, что нахожусь на пороге решения моей проблемы с помощью этого решения, но у меня все еще есть некоторые проблемы. Не могли бы вы дать понимание? Вопрос можно найти здесь: stackoverflow.com/questions/28704644/…
Я знаю, что на это уже был дан ответ, но я использовал это и расширил его еще немного в своем коде, чтобы у вас не было поиска только с помощью uid. Я просто хочу поделиться им для всех, кому может понадобиться эта функциональность.
Вот мой пример и, пожалуйста, обратите внимание, что это мой первый ответ. Я достал массив param, потому что мне нужно было искать только один конкретный массив, но вы могли бы легко добавить его. Я хотел по существу искать больше, чем просто uid.
Кроме того, в моей ситуации может быть несколько ключей для возврата в результате поиска другими полями, которые могут быть не уникальными.
/** * Search Revisions * @param string value to search for, ie a specific field name like name_first * @param string associative key to find it in, ie field_name * * @return array keys. */ public function search_revisions($search_value, $key_to_search) < // This function will search the revisions for a certain value // related to the associative key you are looking for. $keys = array(); foreach ($this->revisions as $key => $cur_value) < if ($cur_value[$key_to_search] === $search_value) < $keys[] = $key; >> return $keys; >
Позже я закончил писать это, чтобы разрешить мне искать другое значение и ассоциативный ключ. Поэтому мой первый пример позволяет вам искать значение в любом конкретном ассоциативном ключе и возвращать все совпадения.
Этот второй пример показывает вам, где значение ( «Тейлор» ) найдено в определенном ассоциативном ключе (first_name) И другое значение (true) найдено в другом ассоциативном ключе (используется) и возвращает все совпадения (Ключи, в которых используются люди с именем «Тейлор» И).
/** * Search Revisions * @param string $search_value The value to search for, ie a specific 'Taylor' * @param string $key_to_search The associative key to find it in, ie first_name * @param string $other_matching_key The associative key to find in the matches for employed * @param string $other_matching_value The value to find in that matching associative key, ie true * * @return array keys, ie all the people with the first name 'Taylor' that are employed. */ public function search_revisions($search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) < // This function will search the revisions for a certain value // related to the associative key you are looking for. $keys = array(); foreach ($this->revisions as $key => $cur_value) < if ($cur_value[$key_to_search] === $search_value) < if (isset($other_matching_key) && isset($other_matching_value)) < if ($cur_value[$other_matching_key] === $other_matching_value) < $keys[] = $key; >> else < // I must keep in mind that some searches may have multiple // matches and others would not, so leave it open with no continues. $keys[] = $key; >> > return $keys; >
array_search
array_search-ищет в массиве заданное значение и в случае успеха возвращает первый соответствующий ключ.
Description
array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false
Parameters
Note:
Если needle является строкой, сравнение выполняется с учетом регистра.
Если третий параметр strict установлен в true то array_search () функция будет искать идентичные элементы в haystack . Это означает, что он также будет выполнять строгое сравнение типов needle в haystack , и объекты должны быть одним и тем же экземпляром.
Return Values
Возвращает ключ для needle если он найден в массиве, в противном случае — false .
Если needle найдена в haystack более одного раза, возвращается первый соответствующий ключ. Чтобы вернуть ключи для всех совпадающих значений, используйте вместо этого array_keys () необязательный параметр search_value .
Эта функция может возвращать логическое значение false , но также может возвращать не-логическое значение, которое оценивается как false . Пожалуйста, прочтите раздел о логических значениях для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции.
Examples
Пример # 1 array_search () Пример
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red'); $key = array_search('green', $array); // $key = 2; $key = array_search('red', $array); // $key = 1; ?>
See Also
- array_keys () — возвращает все ключи или подмножество ключей массива
- array_values () — Возвращает все значения массива
- array_key_exists () — Проверяет, существует ли данный ключ или индекс в массиве
- in_array () — Проверяет, существует ли значение в массиве
PHP 8.2
(PHP 5 5.3.0,7,8)array_replace_recursive Заменяет элементы из переданных массивов в первый рекурсивно array_replace_recursive()заменяет значения
(PHP 4,5,7,8)array_reverse Возвращает an с элементами по порядку Принимает входной массив и возвращает новый с обратным порядком элементов.
(PHP 4,5,7,8)array_shift элемент от начала array_shift()сдвигает первое значение off и возвращает его,сокращая на один элемент перемещение
(PHP 4,5,7,8)array_slice Извлечение array_slice()возвращает последовательность элементов из указанных параметрами offset и length.
array_search
Замечание:
Если needle является строкой, сравнение происходит с учетом регистра.
Если третий параметр strict установлен в TRUE , то функция array_search() будет искать идентичные элементы в haystack . Это означает, что также будут проверяться типы needle в haystack , а объекты должны быть одни и тем же экземпляром.
Возвращаемые значения
Возвращает ключ для needle , если он был найден в массиве, иначе FALSE .
Если needle присутствует в haystack более одного раза, будет возвращён первый найденный ключ. Для того, чтобы возвратить ключи для всех найденных значений, используйте функцию array_keys() с необязательным параметром search_value .
Эта функция может возвращать как boolean FALSE , так и не-boolean значение, которое приводится к FALSE . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.
Список изменений
Версия | Описание |
---|---|
5.3.0 | Вместе со всеми внутренними функциями PHP начиная с 5.3.0, array_search() возвращает NULL , если ей были переданы неверные параметры. |
4.2.0 | До PHP 4.2.0, array_search() при неудаче возвращал NULL вместо FALSE . |
Примеры
Пример #1 Пример использования array_search()
$array = array( 0 => ‘blue’ , 1 => ‘red’ , 2 => ‘green’ , 3 => ‘red’ );
?php
$key = array_search ( ‘green’ , $array ); // $key = 2;
$key = array_search ( ‘red’ , $array ); // $key = 1;
?>
Смотрите также
- array_keys() — Возвращает все или некоторое подмножество ключей массива
- array_values() — Выбирает все значения массива
- array_key_exists() — Проверяет, присутствует ли в массиве указанный ключ или индекс
- in_array() — Проверяет, присутствует ли в массиве значение
array_search
Замечание:
Если needle является строкой, сравнение происходит с учетом регистра.
Если третий параметр strict установлен в TRUE , то функция array_search() будет искать идентичные элементы в haystack . Это означает, что также будут проверяться типы needle в haystack , а объекты должны быть одни и тем же экземпляром.
Возвращаемые значения
Возвращает ключ для needle , если он был найден в массиве, иначе FALSE .
Если needle присутствует в haystack более одного раза, будет возвращён первый найденный ключ. Для того, чтобы возвратить ключи для всех найденных значений, используйте функцию array_keys() с необязательным параметром search_value .
Эта функция может возвращать как boolean FALSE , так и не-boolean значение, которое приводится к FALSE . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.
Список изменений
Версия | Описание |
---|---|
5.3.0 | Вместе со всеми внутренними функциями PHP начиная с 5.3.0, array_search() возвращает NULL , если ей были переданы неверные параметры. |
4.2.0 | До PHP 4.2.0, array_search() при неудаче возвращал NULL вместо FALSE . |
Примеры
Пример #1 Пример использования array_search()
$array = array( 0 => ‘blue’ , 1 => ‘red’ , 2 => ‘green’ , 3 => ‘red’ );
?php
$key = array_search ( ‘green’ , $array ); // $key = 2;
$key = array_search ( ‘red’ , $array ); // $key = 1;
?>
Смотрите также
- array_keys() — Возвращает все или некоторое подмножество ключей массива
- array_values() — Выбирает все значения массива
- array_key_exists() — Проверяет, присутствует ли в массиве указанный ключ или индекс
- in_array() — Проверяет, присутствует ли в массиве значение