harjed
harjed

Reputation: 61

How to group the nested array based on id?

Basically I have an associative array from the database like below,

persons = [
           [id=>1, name=>adam, hobbyId=>x, hobbyName=> swim],
           [id=>2, name=>brian, hobbyId=>y, hobbyName=> read],
           [id=>1, name=>adam, hobbyId=>z, hobbyName=> sing]
          ]

I want to convert it to a new style like JSON object, something like this,

new_persons = [
               [id=>1, name=>adam, hobbies => [[hobbyId=>x, hobbyName=> swim],[hobbyId=>z, 
                hobbyName=> sing]],
               [id=>2, name=>brian, hobbies => [[hobbyId=>y, hobbyName=>read]]
              ]

What I have tried is,

$new_persons = array();
        if (count($persons) > 0) {
            foreach ($persons as $item) {
                $detail = array(
                    'id' => $item['id'],
                    'name' => $item['name'],
                    'hobbies' => [['hobbyId'=>$item['hobbyId'],'hobbyName'=>$item['hobbyName']]]
                );
                if (in_array($item['id'], $newArray)) {
                    array_push($newArray['hobbies'], ['hobbyId'=>$item['hobbyId'],'hobbyName'=>$item['hobbyName']]);
                } else {
                    array_push($newArray, $detail);
                }
            }
        }

But it doesn't meet my requirements, What is wrong with my code?

Upvotes: 0

Views: 177

Answers (1)

arya_la
arya_la

Reputation: 532

$t2 = [];
foreach ($t as $item) {
    if (!isset($t2[$item['id']])) {
        $t2[$item['id']] = [
            'id'   => $item['id'],
            'name' => $item['name'],
        ];
    }
    $t2[$item['id']]['hobbies'][] = [
            'hobbyId'   => $item['hobbyId'],
            'hobbyName' => $item['hobbyName'],
    ];
}

Upvotes: 2

Related Questions