PHP multidimensional array search by value
The function call search_by_uid(100) (uid of first user) should return 0 . The function call search_by_uid(40489) should return 2 . I tried making loops, but I want a faster executing code.
I wrote a script to test the performance of a few of the answers. It generates a 500k-member array of arrays and searches through it for a value in the last member. I compared a function like the accepted answer, to the two array_column one-liner answers. I modified them all to return the actual discovered array, not just the key, because usually that’s my use case. The function method scored 0.361, search-col 0.184 and keys-col 0.189 average micro delay over 1000 runs for each method.
23 Answers 23
function searchForId($id, $array) < foreach ($array as $key =>$val) < if ($val['uid'] === $id) < return $key; >> return null; >
This will work. You should call it like this:
$id = searchForId('100', $userdb);
It is important to know that if you are using === operator compared types have to be exactly same, in this example you have to search string or just use == instead === .
Based on angoru answer. In later versions of PHP ( >= 5.5.0 ) you can use one-liner.
$key = array_search('100', array_column($userdb, 'uid'));
You should also be able to do this without PHP 5.5 in a one liner using array_map in place of array_column. Just replace array_column($userdb, ‘uid’) with array_map(function($v)
Yea, you are right. Lambda functions are available since PHP 5.3. and better is array_search , isn’t it?
@angoru I think the original solution (the foreach loop) will perform faster because it stops as soon as a match is found. The newer solution has to iterate through the whole array once to extract array_column , then loop through it a second time to perform the search (until it finds a match). The newer solution is easier to read, more concise, but the OP specifically brought up performance as an issue
@JakubTruneček . I have something to do with the same array given in the question. I want user’s name from the array by passing id. Function findUserName(40489) should return ‘Michael’. How its possible?
Keep in mind that the one-liner answer wont work if your array keys are not 0, 1, 2, 3, n (numerical and in order starting with zero), because using array_column will reset the keys.
If you are using (PHP 5 >= 5.5.0) you don’t have to write your own function to do this, just write this line and it’s done.
If you want just one result:
$key = array_search(40489, array_column($userdb, 'uid'));
$keys = array_keys(array_column($userdb, 'uid'), 40489);
In case you have an associative array as pointed in the comments you could make it with:
$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, 'uid')),40489);
Update: I’ve been making some simple benchmarks and the multiple results form seems to be the fastest one, even faster than the Jakub custom function!
what if the value I am searching(in this example is 40489) appears more that one time and I want to get all the keys that it appears?
if the value 40489 appears more then once in the array will the function return an array of keys . ?? @angoru
This did not work for me when the key in the $userdb did not start as 0,1, 2 etc.. and say the key are 1234,4566 etc. The resulting keys after the array_search are always 0,1,2 and so on
This won’t work with an associative array, however you can get around that like so: array_search(40489, array_combine(array_keys($userdb), array_column($userdb, ‘uid’)))
Note: If no case is found, the first statement returns false and the next two statements return an empty array [] .
In later versions of PHP (>= 5.5.0) you can use this one-liner:
$key = array_search('100', array_column($userdb, 'uid'));
Just put array_column result in a specific variable avoiding array_column be called for each result on the array.
Building off Jakub’s excellent answer, here is a more generalized search that will allow the key to specified (not just for uid):
function searcharray($value, $key, $array) < foreach ($array as $k =>$val) < if ($val[$key] == $value) < return $k; >> return null; >
Usage: $results = searcharray(‘searchvalue’, searchkey, $array);
Looks array_filter will be suitable solution for this.
$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' ) );
,ARRAY_FILTER_USE_BOTH); // With latest PHP third parameter is optional.. Available Values:- ARRAY_FILTER_USE_BOTH OR ARRAY_FILTER_USE_KEY $values= print_r(array_values($found)); $keys = print_r(array_keys($found));
I think this is the proper solution to return the entire resulting array preserving the key. A shorter approach with PHP >= 7: array_filter($userdb, fn ($v) => $v[‘uid’] == $search) . You don’t even need to pass the var to the callback. Check php.net/manual/es/functions.arrow.php
I know this was already answered, but I used this and extended it a little more in my code so that you didn’t have search by only the uid. I just want to share it for anyone else who may need that functionality.
Here’s my example and please bare in mind this is my first answer. I took out the param array because I only needed to search one specific array, but you could easily add it in. I wanted to essentially search by more than just the uid.
Also, in my situation there may be multiple keys to return as a result of searching by other fields that may not be unique.
/** * @param array multidimensional * @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. */ function search_revisions($dataArray, $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 ($dataArray as $key =>$cur_value) < if ($cur_value[$key_to_search] == $search_value) < $keys[] = $key; >> return $keys; >
Later, I ended up writing this to allow me to search for another value and associative key. So my first example allows you to search for a value in any specific associative key, and return all the matches.
This second example shows you where a value (‘Taylor’) is found in a certain associative key (first_name) AND another value (true) is found in another associative key (employed), and returns all matches (Keys where people with first name ‘Taylor’ AND are employed).
/** * @param array multidimensional * @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. */ function search_revisions($dataArray, $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 ($dataArray 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; >
Use of function
$data = array( array( 'cust_group' => 6, 'price' => 13.21, 'price_qty' => 5 ), array( 'cust_group' => 8, 'price' => 15.25, 'price_qty' => 4 ), array( 'cust_group' => 8, 'price' => 12.75, 'price_qty' => 10 ) ); $findKey = search_revisions($data,'8', 'cust_group', '10', 'price_qty'); print_r($findKey);
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() — Проверяет, присутствует ли в массиве значение