PHP数组重新排列为Multi Dimensional

时间:2015-05-14 05:46:33

标签: php arrays multidimensional-array

我有一个这样的数组结构,想要将它重新排列到下面的那个。有关快速/简单修复的建议吗?我已经添加了日期。谢谢! :)

输入:

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

输出:

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

我的尝试:

<?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....

3 个答案:

答案 0 :(得分:1)

foreach($arr as $v)
{
   if(!$arr2[$v['company_name']]['employees'])
      $arr2[$v['company_name']]['employees'] = array();
   if(!$arr2[$v['company_name']]['company_total_hours'])
      $arr2[$v['company_name']]['company_total_hours'] = '2h';//addional value
   $arr2[$v['company_name']]['employees'][] = array('user_id'=>$v['user_id'],
      'display_name'=>$v['display_name']
   );

}

答案 1 :(得分:1)

我不知道你从哪里得到你的小时,所以我把它留了出来。

$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++;
    }

给你:

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
                        )

                )

        )

)

答案 2 :(得分:0)

我创建了一个与@Rasclatt给出的答案完全相同的函数。

function groupByKeyValue($array, $oldKeyName, $newKeyName){
    $newArray = array();
    foreach($array as $key=>$value){
        if(isset($newArray[$value[$oldKeyName]][$newKeyName])){
            $newArray[$value[$oldKeyName]][$newKeyName][] = array('user_id'=> $value['user_id'], 'display_name' => $value['display_name']);
        }else{
            $newArray[$value[$oldKeyName]] = array($newKeyName => array(array('user_id'=> $value['user_id'], 'display_name' => $value['display_name'])));
        }
    }
    return $newArray;
}
//usage
$newArray = groupByKeyValue($array, 'company_name', 'employees');

您可以添加第三个参数来发送数组值的键,这些键需要在新阵列中用于&#39; employees&#39;。请查看此链接以了解函数http://goo.gl/I6Of5y

的工作情况