Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

convert array with objects to one associative array without foreach

Tags:

php

I have an array like(result of json_decode):

array(2) {
  [0]=>
  object(stdClass)#1 (3) {
    ["key"]=>
    string(6) "sample"
    ["startYear"]=>
    string(4) "2000"
    ["endYear"]=>
    string(4) "2015"
  }
  [1]=>
  object(stdClass)#2 (3) {
    ["key"]=>
    string(13) "second_sample"
    ["startYear"]=>
    string(4) "1986"
    ["endYear"]=>
    string(4) "1991"
  }
}

I want to convert it to array like:

 array(2) {
  ["sample"]=>
  array(2) {
    ["startYear"]=>
    string(4) "2000"
    ["endYear"]=>
    string(4) "2015"
  }
  ["second_sample"]=>
  array(2) {
    ["startYear"]=>
    string(4) "1986"
    ["endYear"]=>
    string(4) "1991"
  }
}

Is there beauty way to do this (cureently I'm using foreach, but I'm not sure it is a best solution).

Added a code example:

<?php
$str='[{"key":"sample","startYear":"2000","endYear":"2015"},{"key":"second_sample","startYear":"1986","endYear":"1991"}]';

$arr=json_decode($str);

var_dump($arr);

$newArr=array();

foreach ($arr as $value){
$value=(array)$value;
$newArr[array_shift($value)]=$value;

}

var_dump($newArr);
like image 353
Evgenii Malikov Avatar asked Oct 14 '25 18:10

Evgenii Malikov


2 Answers

You can use array_reduce

$myArray = array_reduce($initialArray, function ($result, $item) {
    $item = (array) $item;

    $key = $item['key'];
    unset($item['key']);

    $result[$key] = $item;

    return $result;
}, array());
like image 107
Mihai Matei Avatar answered Oct 17 '25 07:10

Mihai Matei


You can create the desired output without making any iterated function calls by using a technique called "array destructuring" (which is a functionless version of list()). Demo

Language Construct Style:

$result = [];
foreach ($array as $object) {
    [
        'key' => $key,
        'startYear' => $result[$key]['startYear'],
        'endYear' => $result[$key]['endYear']
    ] = (array)$object;
}
var_export($result);

Functional Style:

var_export(
    array_reduce(
        $array,
        function($result, $object) {
            [
                'key' => $key,
                'startYear' => $result[$key]['startYear'],
                'endYear' => $result[$key]['endYear']
            ] = (array)$object;
            return $result;
        },
        []
    )
);

Both will output:

array (
  'sample' => 
  array (
    'startYear' => '2000',
    'endYear' => '2015',
  ),
  'second_sample' => 
  array (
    'startYear' => '1985',
    'endYear' => '1991',
  ),
)
like image 35
mickmackusa Avatar answered Oct 17 '25 09:10

mickmackusa



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!