Since PHP 5.5, you can use array_column:
$ids = array_column($users, 'id');
This is the preferred option on any modern project. However, if you must support PHP<5.5, the following alternatives exist:
Since PHP 5.3, you can use array_map with an anonymous function, like this:
$ids = array_map(function ($ar) {return $ar['id'];}, $users);
Before (Technically PHP 4.0.6+), you must create an anonymous function with create_function instead:
$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);
Answer from phihag on Stack OverflowSince PHP 5.5, you can use array_column:
$ids = array_column($users, 'id');
This is the preferred option on any modern project. However, if you must support PHP<5.5, the following alternatives exist:
Since PHP 5.3, you can use array_map with an anonymous function, like this:
$ids = array_map(function ($ar) {return $ar['id'];}, $users);
Before (Technically PHP 4.0.6+), you must create an anonymous function with create_function instead:
$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);
PHP 5.5+
Starting PHP5.5+ you have array_column() available to you, which makes all of the below obsolete.
PHP 5.3+
$ids = array_map(function ($ar) {return $ar['id'];}, $users);
Solution by @phihag will work flawlessly in PHP starting from PHP 5.3.0, if you need support before that, you will need to copy that wp_list_pluck.
PHP < 5.3
Wordpress 3.1+In Wordpress there is a function called wp_list_pluck If you're using Wordpress that solves your problem.
PHP < 5.3If you're not using Wordpress, since the code is open source you can copy paste the code in your project (and rename the function to something you prefer, like array_pick). View source here
Videos
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 function
function array_search_multidim($array, $column, $key){
return (array_search($key, array_column($array, $column)));
}
// use it
array_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).
Note on Update III
- not taking performance into account: you can use array_combine with array_keys & array_column to overcome this limitation in a one-liner like:
$product_search_index =
array_search( 'breville-one-touch-tea-maker-BTM800XL', array_filter( array_combine( array_keys($products), array_column( $products, 'slug' ) ) ) );
Very simple:
function myfunction($products, $field, $value)
{
foreach($products as
product)
{
if ( $product[$field] === $value )
return $key;
}
return false;
}
I am querying data from an API and the return result is very cumbersome to deal with.
It's a multidimensional array but the indexes are a mix of keys and ints. Like
$result[0]['keyValueX'][0]['keyValueY']
And it's possible that using another type of query will yield the result in a different order of indexes:
$result['keyValueB'][0]['keyValueX']
But what I'm interested in, is knowing if the result has a particular key that exists somewhere deep within it. At any level. And if it does exist, just return the value that is associated with that key......instead of me having to type out all these indexes just to reach that place.
What's the way to do this? I have tried
array_keys($result)
but when I do that, it only gives me the first level of keys that exist. On the outermost level. It does not go deeper in.
Try this
function array_keys_multi(array $array)
{
$keys = array();
foreach ($array as $key => $value) {
$keys[] = $key;
if (is_array($value)) {
$keys = array_merge($keys, array_keys_multi($value));
}
}
return $keys;
}
If you don't know what the size of the array is going to be, use a recursive function with a foreach loop that calls itself if each $val is an array. If you do know the size, then just foreach through each dimension and record the keys from each.
Something like this:
<?php
function getKeysMultidimensional(array $array)
{
$keys = array();
foreach($array as $key => $value)
{
$keys[] = $key;
if( is_array($value) ) {
$keys = array_merge($keys, getKeysMultidimensional($value));
}
}
return $keys;
}