php поиск в ассоциативном массиве по значению ключа
Ассоциативные массивы в PHP с примерами
Массивы — способ хранить много похожей информации в одном месте.
Массив проще всего представить как много подписанных коробок при переезде. В каждой коробке может лежать что угодно, например, числа, строки, объекты или даже другие коробки.
Зачем нужны массивы
В массивах хранится информация — например, о том, что лежит в каждой коробке. В коробки можно заглянуть, используя индекс элемента — номер коробки.
Каждая коробка — элемент массива, номер под ней — индекс. То, что лежит внутри коробки — значение элемента.
Как создать массив в PHP
Чтобы создать массив в PHP напишем так:
Теперь есть два способа туда что-то добавить. Если мы знаем, на какое место в массиве вставить элемент, используем индекс.
Если мы не знаем конкретные индексы или просто хотим добавить элементы в массив по порядку, нужна такая запись:
Нумерация в массивах
По умолчанию счёт элементов массива идёт от нуля. То есть при обращении к коробкам нужно помнить, что у первой номер ноль, у второй — 1, и так далее.
Здесь у второго элемента массива номер 1, а значение — 2
Но массиву можно задать любую нумерацию. Допустим, мы хотим записать в массив значения степеней двойки.
Этот код создаст массив из трёх элементов, с номерами 2, 4 и 7. Это легко проверить, если запустить его:
Ассоциативные массивы в PHP
Это такие же массивы, только у них индекс не число, а строка. Или что угодно ещё. Неудобно подписывать коробки при переезде по номерам — но если написать «Кухня», «Спальня» или «Гостиная», то сразу будет понятно, где что.
Индекс в таком случае называется ключом — можно представить, что коробка закрыта на замок, а знание ключа поможет её открыть.
Возьмём кухонную коробку, в которой лежат ложки, ножи и тарелки. Можно собрать её двумя способами. Так:
Как вывести массив
Ассоциативные массивы можно использовать в вакууме, но мы рассмотрим случаи, когда они используются в настоящих сайтах.
Это форма обратной связи с тремя полями. Обратите внимание на атрибуты name в каждом из полей ввода.
Это такая же форма, как выше. Разница в method=»get» — и чуть позже расскажу, в чём ещё.
Значительная разница в том, что при загрузке страницы с таким кодом, в адресе страницы появятся данные из формы.
С получением данных через GET и POST можно поэкспериментировать в первой главе курса «Знакомство с PHP».
Получение массива из базы MySQL
Ещё один частый случай использования ассоциативных массивов — при загрузке данных из базы данных. И если мы храним большую таблицу в базе, то может быть неудобно назначать столбцам номера. А вот чтобы у каждого элемента ключом стал заголовок — хорошая практика, так и запоминать будет удобнее.
Допустим, у нас есть база данных в MySQL, мы подключаемся к ней, делаем запрос и получаем список пользователей.
Разбираем код
Заводим пустой массив для полученных данных.
В этой строчке начинаем построчно считывать результаты.
И если результаты есть, записываем их в ассоциативный массив.
Упражнения с массивами на PHP
У нас есть бесплатный интерактивный курс, где можно без установки 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 указывается параметр в функции, поэтому теперь вызов приведенного ниже кода означает, что вы можете использовать одну функцию для нескольких типов массивов. Небольшое изменение, но тот, который имеет небольшое значение.
array_keys
(PHP 4, PHP 5, PHP 7, PHP 8)
array_keys — Возвращает все или некоторое подмножество ключей массива
Описание
Список параметров
Массив, содержащий возвращаемые ключи.
Если указано, будут возвращены только ключи у которых значения элементов массива совпадают с этим параметром.
Определяет использование строгой проверки на равенство (===) при поиске.
Возвращаемые значения
Примеры
Пример #1 Пример использования array_keys()
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 28 notes
It’s worth noting that if you have keys that are long integer, such as ‘329462291595’, they will be considered as such on a 64bits system, but will be of type string on a 32 bits system.
?>
will return on a 64 bits system:
but on a 32 bits system:
I hope it will save someone the huge headache I had 🙂
Here’s how to get the first key, the last key, the first value or the last value of a (hash) array without explicitly copying nor altering the original array:
Since 5.4 STRICT standards dictate that you cannot wrap array_keys in a function like array_shift that attempts to reference the array.
Invalid:
echo array_shift( array_keys( array(‘a’ => ‘apple’) ) );
But Wait! Since PHP (currently) allows you to break a reference by wrapping a variable in parentheses, you can currently use:
echo array_shift( ( array_keys( array(‘a’ => ‘apple’) ) ) );
However I would expect in time the PHP team will modify the rules of parentheses.
There’s a lot of multidimensional array_keys function out there, but each of them only merges all the keys in one flat array.
Here’s a way to find all the keys from a multidimensional array while keeping the array structure. An optional MAXIMUM DEPTH parameter can be set for testing purpose in case of very large arrays.
NOTE: If the sub element isn’t an array, it will be ignore.
output:
array(
‘Player’ => array(),
‘LevelSimulation’ => array(
‘Level’ => array(
‘City’ => array()
)
),
‘User’ => array()
)
array (size=4)
0 => string ‘e’ (length=1)
1 => int 1
2 => int 2
3 => int 0
—-
expected to see:
dude dude dude
Sorry for my english.
I wrote a function to get keys of arrays recursivelly.
Here’s a function I needed to collapse an array, in my case from a database query. It takes an array that contains key-value pairs and returns an array where they are actually the key and value.
?>
Example usage (pseudo-database code):
= db_query ( ‘SELECT name, value FROM properties’ );
/* This will return an array like so:
/* Now this array looks like:
?>
I found this handy for using with json_encode and am using it for my project http://squidby.com
This function will print all the keys of a multidimensional array in html tables.
It will help to debug when you don?t have control of depths.
An alternative to RQuadling at GMail dot com’s array_remove() function:
The position of an element.
One can apply array_keys twice to get the position of an element from its key. (This is the reverse of the function by cristianDOTzuddas.) E.g., the following may output «yes, we have bananas at position 0».
Hope this helps someone.
# array_keys() also return the key if it’s boolean but the boolean will return as 1 or 0. It will return empty if get NULL value as key. Consider the following array:
Array
(
[ 0 ] => first_index
[ 1 ] => 1
[ 2 ] => 0
[ 3 ] => 4
[ 4 ] => 08
[ 5 ] => 8
[ 6 ] =>
)
This function will extract keys from a multidimensional array
Array
(
[color] => Array
(
[1stcolor] => blue
[2ndcolor] => red
[3rdcolor] => green
)
[size] => Array
(
[0] => small
[1] => medium
[2] => large
)
Array
(
[0] => color
[1] => 1stcolor
[2] => 2ndcolor
[3] => 3rdcolor
[4] => size
[5] => 0
[6] => 1
[7] => 2
)
All the cool notes are gone from the site.
Here’s an example of how to get all the variables passed to your program using the method on this page. This prints them out so you can see what you are doing.
Simple ways to prefixing arrays;
[1] => Array
(
[product_id] => 2
[product_name] => Bar
)
I was looking for a function that deletes either integer keys or string keys (needed for my caching).
As I didn’t find a function I came up with my own solution.
I didn’t find the propiest function to post to so I will post it here, hope you find it useful.
?>
You can of course define constants to have a nicer look, I have chosen these: EXTR_INT = 1; EXTR_STRING = 2
EXTR_INT will return an array where keys are only integer while
EXTR_STRING will return an array where keys are only string
A needed a function to find the keys which contain part of a string, not equalling a string.
array_key_exists
(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)
array_key_exists — Проверяет, присутствует ли в массиве указанный ключ или индекс
Описание
Список параметров
Массив с проверяемыми ключами.
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
array_key_exists() ищет ключи только на первом уровне массива. Внутренние ключи в многомерных массивах найдены не будут.
Примеры
Пример #1 Пример использования array_key_exists()
Пример #2 array_key_exists() и isset()
Примечания
Смотрите также
User Contributed Notes 39 notes
If you want to take the performance advantage of isset() while keeping the NULL element correctly detected, use this:
Benchmark (100000 runs):
array_key_exists() : 205 ms
is_set() : 35ms
isset() || array_key_exists() : 48ms
Note:
The code for this check is very fast, so you shouldn’t warp the code into a single function like below, because the overhead of calling a function dominates the overall performance.
function array_check(. )
<
return (isset(..) || array_key_exists(. ))
>
You’ll notice several notes on this page stating that isset() is significantly faster than array_key_exists(). This may be true except for one small hitch. isset() will return false for arrays keys that have there value set to NULL, which is therefore not entirely accurate.
= array();
$foo [ ‘bar’ ] = NULL ;
Beware that if the array passed to array_key_exists is NULL, the return value will also be NULL.
This is undocumented behaviour, moreover the documentation (and return typehint) suggest that the array_key_exists function only returns boolean value. But that’s not the case.
Rudi’s multidimensional array_key_exists function was not working for me, so i built one that is.
Enjoy.
The way array_key_exists handles null, float, boolean, and ‘integer-representing string’ keys is inconsistent in itself and, in the case of bool and float, with the way these are converted when used as array offset.
array (
» => 1,
0 => 2,
1 => 3,
4 => 4,
’08’ => 5,
8 => 6,
)
null is a key.
false is not a key.
true is not a key.
4.6 is not a key.
«08» is a key.
«8» is a key.
Well, and you get this warning three times (on the bools and the float, but not on the null):
Warning: array_key_exists() [function.array-key-exists]: The first argument should be either a string or an integer in /var/www/php/test.php on line 6
I’ve got a new take on the multi key function I would like to share.
Very simple case-insensitive array_key_exists:
bool (in_array(strtolower($needle), array_map(‘strtolower’, array_keys($haystack))))
array_key_exists doesn’t work with objects implementing ArrayAccess interface. It also ignores possible __get() method in such objects, despite the fact it accepts object as a second parameter. It works only with ‘real’ properties.
Here is an example with array_key_exists switching between content-types :
The argument of array_key_exists() vs. isset() came up in the workplace today, so I conducted a little benchmark to see which is faster:
?>
On Windows, the output is similar to
array_key_exists(): 0.504 [82.895%] seconds
isset(): 0.104 [17.105%] seconds
On Mac or Linux, isset() is faster but only by a factor of approximately 1.5.
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: