Auto generate key name from another key name value when decoding from JSON [duplicate]

This is the set of result from my database

print_r($plan);
Array
(
    [0] => Array
        (
            [id] => 2
            [subscr_unit] => D
            [subscr_period] => 
            [subscr_fee] => 
        )

    [1] => Array
        (
            [id] => 3
            [subscr_unit] => M,Y
            [subscr_period] => 1,1
            [subscr_fee] => 90,1000
        )

    [2] => Array
        (
            [id] => 32
            [subscr_unit] => M,Y
            [subscr_period] => 1,1
            [subscr_fee] => 150,1500
        )

)

How can I change the $plan[0] to $plan[value_of_id]

Thank You.


This won't do it in-place, but:

$new_plan = array();
foreach ($plan as $item)
{
  $new_plan[$item['id']] = $item;
}

This may be a bit late but I've been looking for a solution to the same problem. But since all of the other answers involve loops and are too complicated imho, I've been trying some stuff myself.

The outcome

$items = array_combine(array_column($items, 'id'), $items);

It's as simple as that.


You could also use array_reduce which is generally used for, well, reducing an array. That said it can be used to achieve an array format like you want by simple returning the same items as in the input array but with the required keys.

// Note: Uses anonymous function syntax only available as of PHP 5.3.0
//       Could use create_function() or callback to a named function
$plan = array_reduce($plan, function($reduced, $current) {
    $reduced[$current['id']] = $current;
    return $reduced;
});

Note however, if the paragraph above did not make it clear, this approach is overkill for your individual requirements as outlined in the question. It might prove useful however to readers looking to do a little more with the array than simply changing the keys.


Seeing the code you used to assemble $plan would be helpful, but I'm going assume it was something like this

while ($line = $RES->fetch_assoc()) {
    $plan[] = $line;
}

You can simply assign an explicit value while pulling the data from your database, like this:

while ($line = $RES->fetch_assoc()) {
    $plan[$line['id']] = $line;
}

This is assuming $RES is the result set from your database query.