phparraysmultidimensional-array

PHP Array re-arrange to Multi Dimensional


I have an array structure like this and wanted to Re-arrange it to the one below. Any suggestions for a faster/simple fix? I already did the addition of the dates. Thanks! :)

Input:

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

Output:

Array
(
    [Company_A] => Array
        (
            [company_total_hours] => 20h 45m
            [employees] => Array
                (
                    [0] => Array
                        (
                            [user_id] => 255
                            [display_name] => Mark
                        )
                    [1] => Array
                        (
                            [user_id] => 150
                            [display_name] => Paul
                        )
                )
        )
    [Company_B] => Array
        (
            [company_total_hours] => 7h 30m
            [employees] => Array
                (
                    [0] => Array
                        (
                            [user_id] => 25
                            [display_name] => Hulk
                        )
                    [1] => Array
                        (
                            [user_id] => 50
                            [display_name] => Bob
                        )
                )
        )
)

My Attempts:

<?php
$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')
        );
    }
}

// on-going testing right now here....

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
                            )
    
                    )
    
            )
    
    )