Reputation: 57256
I'm having issues getting the key of $items
using array_column
.
This is the $items
array:
$items = array(
1 => [
"id" => 5
],
3 => [
"id" => 6
],
4 => [
"id" => 7
],
);
var_dump(array_column($items,"id"));
Result:
array (size=3)
0 => int 5
1 => int 6
2 => int 7
How can I get the desired result below?
array (size=3)
1 => int 5
3 => int 6
4 => int 7
Upvotes: 24
Views: 27686
Reputation: 394
Here a more "modern-style" solution using inline arrow function (PHP7.4+):
array_map(fn($e) => $e['id'], $items);
PHP official documentation extract:
array_map()
preserve the keys of the array argument if and only if exactly one array is passed
Upvotes: 2
Reputation: 111
I think this is the fastest way to keep keys without loops and iterations
array_diff(array_combine(array_keys($items), array_column($items, 'id')), [null])
Upvotes: 11
Reputation: 101
array_combine(array_keys($data), array_column($data, 'id'));
id => name of the column to display
Upvotes: 2
Reputation: 1154
The simplest and the most performant way is probably using
array_combine(array_keys($data), array_column($data, 0));
Upvotes: 7
Reputation: 8728
I wrote a simple function array_column_keys
that has the same parameters as array_column
.
/**
* Return the values from a single column in the input array by keeping the key
*
* @param array $array A multi-dimensional array (record set) from which to pull a column of values.
* @param mixed $column The column of values to return. This value may be the integer key of the column you wish to retrieve, or it may be the string key name for an associative array. It may also be NULL to return complete arrays (useful together with index_key to reindex the array).
* @param mixed $index_key [optional] The column to use as the index/keys for the returned array. This value may be the integer key of the column, or it may be the string key name.
*
* @return array Returns an array of values representing a single column from the input array.
*/
function array_column_keys($array, $column, $index_key = null)
{
$output = [];
foreach ($array as $key => $item) {
$output[@$item[$index_key] ?? $key] = @$item[$column];
}
return array_filter($output, function($item) {
return null !== $item;
});
}
The third parameter index_key
is what I also needed.
This will answer the question when setting third parameter to null
as in following example:
$result = array_column_keys($items, 'id');
...and also let's you define the value for the key
$result = array_column_keys($items, 'id', 'any_key');
This will result in
array (size=3)
string 'any_value1' => int 5
string 'any_value2' => int 6
string 'any_value3' => int 7
Upvotes: 3
Reputation: 439
Looking for the same solution and combine some tricks, I created this:
$userdb=Array
(
"test1" => array
(
'uid' => '100',
'name' => 'Sandra Shush',
'url' => 'urlof100'
),
"test2" => array
(
'uid' => '5465',
'name' => 'Stefanie Mcmohn',
'pic_square' => 'urlof100'
),
"test3" => array
(
'uid' => '40489',
'name' => 'Michael',
'pic_square' => 'urlof40489'
)
);
echo $key = array_search(
40489,
array_filter(
array_combine(
array_keys($userdb),
array_column(
$userdb, 'uid'
)
)
)
);
Result is 'test3'.
Work in array numbers or named arrays.
Upvotes: 5
Reputation: 33
For your example with only one column id
array_map('current', $items);
Upvotes: 1
Reputation: 51
Another alternative is to use array_map
$result = array_map(function($item) {return $item['id'];}, $items);
Upvotes: 4
Reputation: 2034
See if this could help
array_filter(array_combine(array_keys($items), array_column($items, 'id')));
Upvotes: 37
Reputation: 281
foreach(key($parameters) as $key)
{
print($key);
}
You can also store that result in other variables if desired.
And to show both keys and values try this:
foreach ($parameters as $key => $value) {
echo $key . ' = ' . $value . '<br>';
}
Upvotes: -3