PHP Multidimensional Array Searching (Find key by specific value)
Another poossible solution is based on the array_search()
function. You need to use PHP 5.5.0 or higher.
Example
$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' ));$key = array_search(40489, array_column($userdb, 'uid'));echo ("The key is: ".$key);//This will output- The key is: 2
Explanation
The function array_search()
has two arguments. The first one is the value that you want to search. The second is where the function should search. The function array_column()
gets the values of the elements which key is 'uid'
.
Summary
So you could use it as:
array_search('breville-one-touch-tea-maker-BTM800XL', array_column($products, 'slug'));
or, if you prefer:
// define functionfunction array_search_multidim($array, $column, $key){ return (array_search($key, array_column($array, $column)));}// use itarray_search_multidim($products, 'slug', 'breville-one-touch-tea-maker-BTM800XL');
The original example(by xfoxawy) can be found on the DOCS.
The array_column()
page.
Update
Due to Vael comment I was curious, so I made a simple test to meassure the performance of the method that uses array_search
and the method proposed on the accepted answer.
I created an array which contained 1000 arrays, the structure was like this (all data was randomized):
[ { "_id": "57fe684fb22a07039b3f196c", "index": 0, "guid": "98dd3515-3f1e-4b89-8bb9-103b0d67e613", "isActive": true, "balance": "$2,372.04", "picture": "http://placehold.it/32x32", "age": 21, "eyeColor": "blue", "name": "Green", "company": "MIXERS" },...]
I ran the search test 100 times searching for different values for the name field, and then I calculated the mean time in milliseconds. Here you can see an example.
Results were that the method proposed on this answer needed about 2E-7 to find the value, while the accepted answer method needed about 8E-7.
Like I said before both times are pretty aceptable for an application using an array with this size. If the size grows a lot, let's say 1M elements, then this little difference will be increased too.
Update II
I've added a test for the method based in array_walk_recursive
which was mentionend on some of the answers here. The result got is the correct one. And if we focus on the performance, its a bit worse than the others examined on the test. In the test, you can see that is about 10 times slower than the method based on array_search
. Again, this isn't a very relevant difference for the most of the applications.
Update III
Thanks to @mickmackusa for spotting several limitations on this method:
- This method will fail on associative keys.
- This method will only work on indexed subarrays (starting from 0 and have consecutively ascending keys).
Very simple:
function myfunction($products, $field, $value){ foreach($products as $key => $product) { if ( $product[$field] === $value ) return $key; } return false;}
This class method can search in array by multiple conditions:
class Stdlib_Array{ public static function multiSearch(array $array, array $pairs) { $found = array(); foreach ($array as $aKey => $aVal) { $coincidences = 0; foreach ($pairs as $pKey => $pVal) { if (array_key_exists($pKey, $aVal) && $aVal[$pKey] == $pVal) { $coincidences++; } } if ($coincidences == count($pairs)) { $found[$aKey] = $aVal; } } return $found; } }// Example:$data = array( array('foo' => 'test4', 'bar' => 'baz'), array('foo' => 'test', 'bar' => 'baz'), array('foo' => 'test1', 'bar' => 'baz3'), array('foo' => 'test', 'bar' => 'baz'), array('foo' => 'test', 'bar' => 'baz4'), array('foo' => 'test4', 'bar' => 'baz1'), array('foo' => 'test', 'bar' => 'baz1'), array('foo' => 'test3', 'bar' => 'baz2'), array('foo' => 'test', 'bar' => 'baz'), array('foo' => 'test', 'bar' => 'baz'), array('foo' => 'test4', 'bar' => 'baz1'));$result = Stdlib_Array::multiSearch($data, array('foo' => 'test4', 'bar' => 'baz1'));var_dump($result);
Will produce:
array(2) { [5]=> array(2) { ["foo"]=> string(5) "test4" ["bar"]=> string(4) "baz1" } [10]=> array(2) { ["foo"]=> string(5) "test4" ["bar"]=> string(4) "baz1" }}