Run
Run

Reputation: 57256

PHP array_column - how to keep the keys?

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

Answers (10)

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

Igor Tashlykov
Igor Tashlykov

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

sneha surve
sneha surve

Reputation: 101

array_combine(array_keys($data), array_column($data, 'id'));

id => name of the column to display

Upvotes: 2

kiler129
kiler129

Reputation: 1154

The simplest and the most performant way is probably using

array_combine(array_keys($data), array_column($data, 0));

Upvotes: 7

algorhythm
algorhythm

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

Bruno Rigolon
Bruno Rigolon

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

ReenExe
ReenExe

Reputation: 33

For your example with only one column id

array_map('current', $items);

Upvotes: 1

ajp
ajp

Reputation: 51

Another alternative is to use array_map

$result = array_map(function($item) {return $item['id'];}, $items);

Upvotes: 4

Ashish Choudhary
Ashish Choudhary

Reputation: 2034

See if this could help

array_filter(array_combine(array_keys($items), array_column($items, 'id')));

Upvotes: 37

wie5Ooma
wie5Ooma

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

Related Questions