поиск элемента в многомерном массиве php
PHP поиск многомерных массивов по значению
У меня есть массив, где я хочу найти uid и получить ключ массива.
Примеры
Предположим, у нас есть следующий 2-мерный массив:
Я пытался делать циклы, но я хочу быстрее выполнить код.
Решение
Это будет работать Вы должны назвать это так:
На основе angoru ответ. В более поздних версиях PHP ( >= 5.5.0 ) вы можете использовать однострочник.
Другие решения
Если вы используете (PHP 5> = 5.5.0), вам не нужно писать собственную функцию для этого, просто напишите эту строку, и все готово.
Если вы хотите только один результат:
Для нескольких результатов
Если у вас есть ассоциативный массив, как указано в комментариях, вы можете сделать это с помощью:
Обновление: я делал несколько простых тестов, и форма с несколькими результатами, кажется, самая быстрая, даже быстрее, чем пользовательская функция Jakub!
Я знаю, что на этот вопрос уже был дан ответ, но я использовал его и немного расширил в своем коде, чтобы у вас не было поиска только по uid. Я просто хочу поделиться им с кем-то, кому может понадобиться эта функциональность.
Вот мой пример и, пожалуйста, помните, что это мой первый ответ. Я вынул массив param, потому что мне нужно было искать только один конкретный массив, но вы могли легко добавить его. Я хотел по сути искать больше, чем просто uid.
Кроме того, в моей ситуации может быть несколько ключей для возврата в результате поиска по другим полям, которые могут быть не уникальными.
Позже я закончил писать это, чтобы позволить мне искать другое значение и ассоциативный ключ. Итак, мой первый пример позволяет вам искать значение в любом конкретном ассоциативном ключе и возвращать все совпадения.
Этот второй пример показывает, где в определенном ассоциативном ключе (first_name) найдено значение (‘Taylor’) А ТАКЖЕ другое значение (true) находится в другом ассоциативном ключе (используется) и возвращает все совпадения (ключи, в которых работают люди с именем «Тейлор» И).
Использование функции
Результат
В более поздних версиях PHP (> = 5.5.0) вы можете использовать эту строку:
Видать array_filter будет подходящим решением для этого …
Несмотря на то, что это старый вопрос, на который есть принятый ответ, я подумал, что могу предложить одно изменение в принятом ответе. Итак, во-первых, я согласен, что принятый ответ здесь верен.
Вместо этого вместо предустановленного uid указывается параметр в функции, поэтому теперь вызов приведенного ниже кода означает, что вы можете использовать одну функцию для нескольких типов массивов. Небольшое изменение, но тот, который имеет небольшое значение.
Как искать по ключу=>значение в многомерном массиве в PHP
есть ли быстрый способ получить все подмножества, где пара ключевых значений была найдена в многомерном массиве? Я не могу сказать, насколько глубоким будет массив.
простой пример массива:
когда я ищу ключ=имя и значение= «cat 1», функция должна возвращать:
Я думаю, что функция должна быть рекурсивной, чтобы спуститься на самый глубокий уровень.
14 ответов
ключ есть что search_r берет свой четвертый параметр по ссылке, а не по значению; амперсанд & имеет решающее значение.
как о SPL вместо версии? Это сэкономит вам немного ввода:
что здорово, так это то, что в основном один и тот же код будет перебирать каталог для вас, используя RecursiveDirectoryIterator вместо RecursiveArrayIterator. СПЛ является «роксор».
единственный облом о SPL-это плохо документированы в интернете. Но несколько книг PHP идут в некоторые полезные детали, особенно Pro PHP; и вы, вероятно, можете google для получения дополнительной информации, тоже.
вернулся, чтобы опубликовать это обновление для тех, кому нужен совет по оптимизации этих ответов, в частности, отличный ответ Джона Кугельмана выше.
его опубликованная функция работает нормально, но мне пришлось оптимизировать этот сценарий для обработки 12 000 строк resultset. Функция занимала вечные 8 секунд, чтобы пройти через все записи, waaaaaay слишком долго.
Мне просто нужна функция, чтобы остановить поиск и вернуться, когда матч был найден. Т. е., если вы ищете customer_id, мы знаем у нас есть только один в resultset, и как только мы найдем customer_id в многомерный массив, который мы хотим вернуть.
вот оптимизированная ( и значительно упрощенная ) версия этой функции для всех, кто в ней нуждается. В отличие от другой версии, он может только работать только один глубине массива, не возвращается и не сливая несколько результатов.
это сбило задачу, чтобы соответствовать 12 000 записей до 1,5 секунд. все еще очень дорого но гораздо разумнее.
незначительное улучшение быстрой версии.
будьте осторожны с алгоритмами линейного поиска (выше линейны) в многомерных массивах, поскольку они усложнили сложность, поскольку ее глубина увеличивает количество итераций, необходимых для прохождения всего массива. Например:
потребуется не более 200 итераций, чтобы найти то, что вы ищете (если игла была в [100][1]), с подходящим алгоритмом.
линейные алгоритмы в этом случае выполняют при O (n) (общее количество элементов порядка во всем array), это плохо, миллион записей (например, массив 1000x100x10) займет в среднем 500 000 итераций, чтобы найти иглу. Также что произойдет, если вы решите изменить структуру своего многомерного массива? И PHP выкинет рекурсивный алгоритм, если ваша глубина будет больше 100. Информатика может сделать лучше:
по возможности всегда используйте объекты вместо многомерных массивов:
и примените пользовательский интерфейс компаратора и функция сортировки и поиска:
можно использовать uasort() чтобы использовать пользовательский компаратор, если вы чувствуете себя предприимчивым, вы должны реализовать свои собственные коллекции для своих объектов, которые могут сортировать и управлять ими (я всегда расширяю ArrayObject, чтобы включить функцию поиска по крайней мере).
как только они отсортированы (uasort-O (N log n), что так же хорошо, как и произвольные данные), двоичный поиск может выполнить операцию за O (log n) время, т. е. миллион записи занимает
20 итераций поиска. Насколько мне известно, пользовательский бинарный поиск компаратора не реализован в PHP ( array_search() использует естественный порядок, который работает на ссылках на объекты, а не их свойствах), вам придется реализовать это самостоятельно, как я.
этот подход более эффективен (больше нет глубины) и, что более важно, универсален (при условии, что вы обеспечиваете сопоставимость с помощью интерфейсов), поскольку объекты определяют, как они сортируются, поэтому вы можете повторно использовать код бесконечно. Гораздо лучше =)
array_search
(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)
array_search — Осуществляет поиск данного значения в массиве и возвращает ключ первого найденного элемента в случае успешного выполнения
Описание
Список параметров
Если needle является строкой, сравнение происходит с учётом регистра.
Возвращаемые значения
Примеры
Пример #1 Пример использования array_search()
Смотрите также
User Contributed Notes 45 notes
in (PHP 5 >= 5.5.0) you don’t have to write your own function to search through a multi dimensional array
$userdb=Array
(
(0) => Array
(
(uid) => ‘100’,
(name) => ‘Sandra Shush’,
(url) => ‘urlof100’
),
(1) => Array
(
(uid) => ‘5465’,
(name) => ‘Stefanie Mcmohn’,
(pic_square) => ‘urlof100’
),
(2) => Array
(
(uid) => ‘40489’,
(name) => ‘Michael’,
(pic_square) => ‘urlof40489’
)
);
simply u can use this
$key = array_search(40489, array_column($userdb, ‘uid’));
About searcing in multi-dimentional arrays; two notes on «xfoxawy at gmail dot com»;
It perfectly searches through multi-dimentional arrays combined with array_column() (min php 5.5.0) but it may not return the values you’d expect.
Secondly, if your array is big, I would recommend you to first assign a new variable so that it wouldn’t call array_column() for each element it searches. For a better performance, you could do;
It’s what the document stated «may also return a non-Boolean value which evaluates to FALSE.»
the recursive function by tony have a small bug. it failes when a key is 0
here is the corrected version of this helpful function:
If you are using the result of array_search in a condition statement, make sure you use the === operator instead of == to test whether or not it found a match. Otherwise, searching through an array with numeric indicies will result in index 0 always getting evaluated as false/null. This nuance cost me a lot of time and sanity, so I hope this helps someone. In case you don’t know what I’m talking about, here’s an example:
for searching case insensitive better this:
About searcing in multi-dimentional arrays;
note on «xfoxawy at gmail dot com» and turabgarip at gmail dot com;
$xx = array_column($array, ‘NAME’, ‘ID’);
will produce an array like :
$xx = [
[ID_val] => NAME_val
[ID_val] => NAME_val
]
$yy = array_search(‘tesxt’, array_column($array, ‘NAME’, ‘ID’));
will output expected ID;
I was going to complain bitterly about array_search() using zero-based indexes, but then I realized I should be using in_array() instead.
The essence is this: if you really want to know the location of an element in an array, then use array_search, else if you only want to know whether that element exists, then use in_array()
Be careful when search for indexes from array_keys() if you have a mixed associative array it will return both strings and integers resulting in comparison errors
/* The above prints this, as you can see we have mixed keys
array(3) <
[0]=>
int(0)
[1]=>
string(3) «car»
[2]=>
int(1)
>
*/
hallo every body This function matches two arrays like
search an array like another or not array_match which can match
hey i have a easy multidimensional array search function
Despite PHP’s amazing assortment of array functions and juggling maneuvers, I found myself needing a way to get the FULL array key mapping to a specific value. This function does that, and returns an array of the appropriate keys to get to said (first) value occurrence.
But again, with the above solution, PHP again falls short on how to dynamically access a specific element’s value within the nested array. For that, I wrote a 2nd function to pull the value that was mapped above.
To expand on previous comments, here are some examples of
where using array_search within an IF statement can go
wrong when you want to use the array key thats returned.
Take the following two arrays you wish to search:
I needed a way to return the value of a single specific key, thus:
Better solution of multidimensional searching.
FYI, remember that strict mode is something that might save you hours.
one thing to be very aware of is that array_search() will fail if the needle is a string and the array itself contains values that are mixture of numbers and strings. (or even a string that looks like a number)
The problem is that unless you specify «strict» the match is done using == and in that case any string will match a numeric value of zero which is not what you want.
also, php can lookup an index pretty darn fast. for many scenarios, it is practical to maintain multiple arrays, one in which the index of the array is the search key and the normal array that contains the data.
//very fast lookup, this beats any other kind of search
I had an array of arrays and needed to find the key of an element by comparing actual reference.
Beware that even with strict equality (===) php will equate arrays via their elements recursively, not by a simple internal pointer check as with class objects. The === can be slow for massive arrays and also crash if they contain circular references.
This function performs reference sniffing in order to return the key for an element that is exactly a reference of needle.
A simple recursive array_search function :
A variation of previous searches that returns an array of keys that match the given value:
I needed a function, that returns a value by specifying a keymap to the searched value in a multidimensional array and came up with this.
My function get_key_in_array() needed some improvement:
An implementation of a search function that uses a callback, to allow searching for objects of arbitrary complexity:
For instance, if you have an array of objects with an id property, you could search for the object with a specific id like this:
For a more complex example, this function takes an array of key/value pairs and returns the key for the first item in the array that has all those properties with the same values.
The final step is a function that returns the item, rather than its key, or null if no match found:
Функции для работы с массивами
Содержание
User Contributed Notes 14 notes
A simple trick that can help you to guess what diff/intersect or sort function does by name.
Example: array_diff_assoc, array_intersect_assoc.
Example: array_diff_key, array_intersect_key.
Example: array_diff, array_intersect.
Example: array_udiff_uassoc, array_uintersect_assoc.
This also works with array sort functions:
Example: arsort, asort.
Example: uksort, ksort.
Example: rsort, krsort.
Example: usort, uasort.
?>
Return:
Array ( [ 0 ] => Cero [ 1 ] => Uno [ 2 ] => Dos [ 3 ] => Cuatro [ 4 ] => Cinco [ 5 ] => Tres [ 6 ] => Seis [ 7 ] => Siete [ 8 ] => Ocho [ 9 ] => Nueve [ 10 ] => Diez )
Array ( [ 0 ] => Cero [ 1 ] => Uno [ 2 ] => Dos [ 3 ] => Tres [ 4 ] => Cuatro [ 5 ] => Cinco [ 6 ] => Seis [ 7 ] => Siete [ 8 ] => Ocho [ 9 ] => Nueve [ 10 ] => Diez )
?>
Updated code of ‘indioeuropeo’ with option to input string-based keys.
Here is a function to find out the maximum depth of a multidimensional array.
// return depth of given array
// if Array is a string ArrayDepth() will return 0
// usage: int ArrayDepth(array Array)
Short function for making a recursive array copy while cloning objects on the way.
If you need to flattern two-dismensional array with single values assoc subarrays, you could use this function:
to 2g4wx3:
i think better way for this is using JSON, if you have such module in your PHP. See json.org.
to convert JS array to JSON string: arr.toJSONString();
to convert JSON string to PHP array: json_decode($jsonString);
You can also stringify objects, numbers, etc.
Function to pretty print arrays and objects. Detects object recursion and allows setting a maximum depth. Based on arraytostring and u_print_r from the print_r function notes. Should be called like so:
I was looking for an array aggregation function here and ended up writing this one.
Note: This implementation assumes that none of the fields you’re aggregating on contain The ‘@’ symbol.
While PHP has well over three-score array functions, array_rotate is strangely missing as of PHP 5.3. Searching online offered several solutions, but the ones I found have defects such as inefficiently looping through the array or ignoring keys.
PHP: Поиск в массиве
Поиск значения в массиве требуется практически в каждом PHP приложении, скрипте работающим с данными, для чего существует множество способов и специальных функций. В зависимости от задачи и типа поиска следует использовать те или иные инструменты, учитывая их особенности, скорость выполнения и удобство в применении. Далее мы ознакомимся с PHP функциями поиска элементов в массиве, возможными конструкциями и методами, а также выясним какой способ наиболее быстрый.
Функции для поиска в массиве:
array_search — служит для поиска значения в массиве. В случае удачи она возвращает ключ искомого значения, если ничего не найдено — возвращает FALSE. До версии PHP 4.2.0, array_search() при неудаче возвращала NULL, а не FALSE.
Синтаксис функции mixed array_search ( mixed needle, array haystack [, bool strict] ).
Если значение needle (то, что ищем в массиве), является строкой, то производится регистро-зависимое сравнение.
Если передать в функцию в качестве третьего параметра (это не обязательно) значение TRUE, то поиск будет производится с учетом типа переменной.
Стоит учитывать, если искомое значение встречается в массиве несколько раз, то функция вернет только один — первый найденный ключ.
in_array — Проверяет, присутствует ли в массиве значение, в случае успеха возвращает TRUE, неудачи FALSE. Как вы понимаете функция служит для поиска и определения наличия элемента в массиве, ключ на сам же элемент не возвращается.
Функции для перебора элементов массива, с последующим поиском:
foreach — Перебирает элементы массива, работает только с массивами и объектами, в случае использования переменных отличного типа, PHP выдаст ошибку.
Возможны два вида синтаксиса (подробнее тут):
Пример использования функции с конструкцией foreach для поиска элемента массива, возвращает TRUE при успехе
Возвращает ключ элемента массива при успехе
while — цикл, с помощью которого также можно произвести поиск элемента в массиве. Подробнее о самой конструкции, тут.
Синтаксис конструкции
while (expr)
statement
Возвращает ключ элемента массива при успехе
Из выше описанных примеров видно, что одни методы служат для поиска элемента в одномерных массивах, другие позволяют организовать поиск в многомерных массивах. Выбор метода зависит от типа обрабатываемых данных, будь то простой массив, или сложные многомерные деревья.
Далее произведем замер среднего времени выполнения функций поиска:
Число элементов массива | array_search | Цикл foreach | Цикл while |
10 | 0.0000068 | 0.0000064 | 0.0000076 |
100 | 0.0000078 | 0.0000153 | 0.0000185 |
1000 | 0.0000209 | 0.0001177 | 0.0001351 |
10000 | 0.0004210 | 0.0012128 | 0.0018670 |
100000 | 0.0039679 | 0.0130989 | 0.0175215 |
Из приведенной таблицы замеров видно, что функция array_search, показывает наилучший результат как при поиске в малых так и больших массивах. При этом время поиска спомощью циклов значительно увеличивается в зависимости от размера массива.