phparraysmultidimensional-arraygroupingsub-array

Group 2d array data by one column and populate echo group with a calculated value and indexed subarrays from other column values


I have an array structure like this and wanted to rearrange it to the one below. Any suggestions for a faster/simple fix? I already did the addition of the dates.

Input:

[
    ['user_id' => 255, 'display_name' => 'Mark', 'company_name' => 'Company_A'],
    ['user_id' => 150, 'display_name' => 'Paul', 'company_name' => 'Company_A'],
    ['user_id' => 25, 'display_name' => 'Hulk', 'company_name' => 'Company_B'],
    ['user_id' => 50, 'display_name' => 'Bob', 'company_name' => 'Company_B'],
];

Output:

[
    'Company_A' => [
        'company_total_hours' => '20h 45m',
        'employees' => [
            ['user_id' => 255, 'display_name' => 'Mark'],
            ['user_id' => 150, 'display_name' => 'Paul'],
        ],
    ],
    'Company_B' => [
        'company_total_hours' => '7h 30m',
        'employees' => [
            ['user_id' => 25, 'display_name' => 'Hulk'],
            ['user_id' => 50, 'display_name' => 'Bob'],
        ],
    ],
]

My Attempt:

$company_names = array();
foreach ($records as $k => $v) {
    $company_names[] = $v->company_name;
}
$company_names = array_unique($company_names);

// hard coded testing
if (count($company_names) > 0) {
    foreach($company_names as $k2 => $v2) {
        $final_array[$v2]['company_total_hours'] = rand(1, 20);
        
        $final_array[$v2]['employees'] = array(
            array('user_id' => '255', 'display_name' => 'Mark'),
            array('user_id' => '150', 'display_name' => 'Paul')
        );
    }
}

Solution

  • I don't see where you derive your hours from so I left that out.

    $i = 0;
    foreach($vals as $keys => $arrays) {
            if(!isset($new[$arrays['company_name']]))
                $i = 0;
            $new[$arrays['company_name']]['employees'][$i]['display_name']  =   $arrays['display_name'];
            $new[$arrays['company_name']]['employees'][$i]['user_id']       =   $arrays['user_id'];
            $i++;
        }
    

    Gives you:

    Array
    (
        [Company_A] => Array
            (
                [employees] => Array
                    (
                        [0] => Array
                            (
                                [display_name] => Mark
                                [user_id] => 255
                            )
    
                        [1] => Array
                            (
                                [display_name] => Paul
                                [user_id] => 150
                            )
    
                    )
    
            )
    
        [Company_B] => Array
            (
                [employees] => Array
                    (
                        [0] => Array
                            (
                                [display_name] => Hulk
                                [user_id] => 25
                            )
    
                        [1] => Array
                            (
                                [display_name] => Bob
                                [user_id] => 50
                            )
    
                    )
    
            )
    
    )