php array search многомерный массив

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 указывается параметр в функции, поэтому теперь вызов приведенного ниже кода означает, что вы можете использовать одну функцию для нескольких типов массивов. Небольшое изменение, но тот, который имеет небольшое значение.

Источник

array_search

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

array_search — Осуществляет поиск данного значения в массиве и возвращает ключ первого найденного элемента в случае успешного выполнения

Описание

Список параметров

Если needle является строкой, сравнение происходит с учётом регистра.

Возвращаемые значения

Примеры

Пример #1 Пример использования array_search()

Смотрите также

User Contributed Notes 44 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:

hallo every body This function matches two arrays like
search an array like another or not array_match which can match

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;

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

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.

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:

Источник

PHP: array_search — быстрый поиск по массиву

Я уже достаточно долго использую функцию array_search() для поиска значений в массиве, так как неоднократно слышал и читал о том, что она работает заметно быстрее, чем поиск по массиву в цикле, но насколько она быстрее — не знал. Наконец-то дошли руки самому проверить и посчитать.

Сравнил скорость поиска в массиве с помощью этой функции с обычным перебором массива в циклах foreach и while. На 10-100 элементах массива разница незаметна да и время столь мало, что им можно принебречь. А вот для больших массивов разница оказалась весьма существенной. С увеличением размера массива на порядок, значительно увеличивалось и время поиска. При ста тысячах элементов скорость foreach падала до 0,013 секунды, а while — до 0,017, при том что array_search() тоже замедлился, но все-таки остался на порядок быстрее — 0.004 секунды. Для большого скрипта, работающего с большими массивами замена поиска в цикле на поиск с помощью array_search() будет вовсе не «блошиной оптимизацией».

UPD: добавил в циклы break и менял искомое значение так, чтобы оно было в середине массива — 5-50-500 и т.д. Данные в таблице обновленные.

Число элементов массиваarray_searchЦикл foreachЦикл while
100.00000680.00000640.0000076
1000.00000780.00001530.0000185
10000.00002090.00011770.0001351
100000.00042100.00121280.0018670
1000000.00396790.01309890.0175215

В связи с этим вспомнил недавнюю дискуссию с одним из коллег на работе — насчет того, нужно ли программисту знать все эти встроенные функции языка, или достаточно «программистского склада ума» и общих познаний. Не вдаваясь с рассуждения об этом самом складе ума, думаю, что все-таки знать функции надо, может быть не весь синтаксис в деталях, а хотя-бы какие функции есть и что они в общих чертах могут.

UPD: нужен программистский склад ума, тоже нужен! И внимательность с памятью не помешают (навеяно break и range 🙂

Под хабракатом код скрипта, которым подсчитывал время:

$mass=100000; // число значений в массиве в котором будем искать
$search=50000; // в массиве будем искать это значение
$first_result=array(); // массив результатов, для вычисления среднего значения первого варианта
$second_result=array(); // массив результатов, для вычисления среднего значения второго варианта
$third_result=array(); // массив результатов, для вычисления среднего значения третьего варианта

Источник

Как искать по ключу=>значение в многомерном массиве в 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() использует естественный порядок, который работает на ссылках на объекты, а не их свойствах), вам придется реализовать это самостоятельно, как я.

этот подход более эффективен (больше нет глубины) и, что более важно, универсален (при условии, что вы обеспечиваете сопоставимость с помощью интерфейсов), поскольку объекты определяют, как они сортируются, поэтому вы можете повторно использовать код бесконечно. Гораздо лучше =)

Источник

Поиск многомерного массива PHP по значению

у меня есть массив, где я хочу искать uid и получить ключ массива.

примеры

предположим, что у нас есть следующий 2-мерный массив:

Я пробовал делать циклы,но мне нужен более быстрый код.

21 ответов

это будет работать. Вы должны назвать это так:

на основе angoru ответ. В более поздних версиях PHP ( >= 5.5.0 ) вы можете использовать ОДН-вкладыш.

Если вы используете (PHP 5 > = 5.5.0), вам не нужно писать свою собственную функцию для этого, просто напишите эту строку, и все готово.

Если вы хотите только один результат:

для нескольких результатов

Если у вас есть ассоциативный массив, как указано в комментариях, вы можете сделать это с:

Если вы используете PHP этот портировать, спасибо Рэмси!

обновление: я был создание некоторых простых тестов и формы множественных результатов кажется самым быстрым, даже быстрее, чем пользовательская функция Jakub!

здание Якуба отличный ответ, вот более обобщенный поиск, который позволит указать ключ (не только для uid):

Я знаю, что на это уже ответили, но я использовал это и расширил его немного больше в своем коде, чтобы у вас не было поиска только uid. Я просто хочу поделиться им для всех, кому может понадобиться эта функциональность.

вот мой пример и, пожалуйста, имейте в виду, что это мой первый ответ. Я достал массив param, потому что мне нужно было искать только один конкретный массив, но вы могли легко добавить его. Я хотел по существу искать больше, чем просто uid.

также, в моей ситуации может быть несколько ключей для возврата в результате поиска по другим полям, которые могут быть не уникальными.

позже я закончил писать это, чтобы позволить мне искать другое значение и ассоциативный ключ. Поэтому мой первый пример позволяет искать значение в любом конкретном ассоциативном ключе и возвращать все совпадения.

в этом втором примере показано, где значение (‘Taylor’) находится в определенном ассоциативном ключе (first_name)и другое значение (true) находится в другом ассоциативном ключе (employed) и возвращает все совпадения (ключи, в которых работают люди с именем «Taylor»).

использование функции

результат

в более поздних версиях PHP (>= 5.5.0) вы можете использовать этот однострочный:

выглядит array_filter будет соответствующее решение для этого.

хотя это старый вопрос и имеет принятый ответ, Я думал, что предложу одно изменение к принятому ответу.. Поэтому, во-первых, я согласен, что принятый ответ здесь правильный.

замена предустановленного » uid » параметром в функции вместо этого, поэтому теперь вызов приведенного ниже кода означает, что вы можете использовать одну функцию для нескольких типов массивов. Небольшое изменение, но оно имеет небольшое значение.

вот один лайнер для того же самого,

мне пришлось использовать функцию un, которая находит все элементы в массиве. Поэтому я изменил функцию сделал Якуб Truneček как следовать:

‘; // Output: // Array // ( // [0] => Array // ( // [a] => Example World // [b] => 2 // ) // // )

просто поделитесь, может быть, это может понравиться.

С помощью вышеуказанного кода можно найти любые (частично совпадающие) данные из любого столбца в 2D-массиве, поэтому идентификатор пользователя можно найти по мере необходимости.

расширяя созданную функцию @mayhem, этот пример будет больше похож на «нечеткий» поиск, если вы просто хотите сопоставить часть (большинство) в строке поиска:

например, значение в массиве приветствуется в Нью-Йорке! и вы хотели первый экземпляр просто » Нью-Йорк!»

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *