如何使用键值在多维数组中移动数组?

时间:2019-04-06 06:55:07

标签: php arrays loops

如何在具有键值的多维数组中移动数组? 我正在使用array_push将值添加到多维数组。我有一个数组

$myArray = Array(Array('code' => '1','room' => Array('name' => 'Room-A')),Array('code' =>'1','room' => Array('name' => 'Room-B'
            )), Array('code' => '2','room' => Array('name' => 'Vip-1')),Array('code' => '2','room' => Array('name' => 'Vip-2')));

我尝试使用如下代码:

for ($i=0; $i <count($myArray) ; $i++) { 
        if ($myArray[$i]['code']=='1') {
            array_push($myArray[$i]['room'], $myArray[$i]['room']);
        }
        else{
            array_push($myArray[$i]['room'], $myArray[$i]['room']);
        }
    }

我想要这样的结果:

Array
(
    [0] => Array
        (
           [code] => 1
           [room] => Array
             (
               [0] => Array
                 (
                    [name] => Room-A 
                 )
               [1] => Array
                 (
                   [name] => Room-B
                 )
             )
        )

    [1] => Array
      (
          [code] => 2
          [room] => Array
              (
             [0] => Array
                 (
                    [name] => Vip-1  
                 )
             [1] => Array
                 (
                   [name] => Vip-2
                 )
              )
        )
  )

有什么想法如何加入这个数组吗?

2 个答案:

答案 0 :(得分:1)

您可以使用array_reduce使用代码作为键将数组汇总为一个关联数组。使用array_values将关联数组转换为简单数组。

$myArray = ....

$result = array_values(array_reduce($myArray, function($c, $v){
    if ( !isset( $c[ $v['code'] ] ) ) $c[ $v['code'] ] = array( 'code' => $v['code'], 'room' => array() );
    $c[ $v['code'] ]['room'][] = $v['room'];
    return $c;
},array()));        

echo "<pre>";
print_r( $result );
echo "</pre>";

这将导致:

Array
(
    [0] => Array
        (
            [code] => 1
            [room] => Array
                (
                    [0] => Array
                        (
                            [name] => Room-A
                        )

                    [1] => Array
                        (
                            [name] => Room-B
                        )

                )

        )

    [1] => Array
        (
            [code] => 2
            [room] => Array
                (
                    [0] => Array
                        (
                            [name] => Vip-1
                        )

                    [1] => Array
                        (
                            [name] => Vip-2
                        )

                )

        )

)

答案 1 :(得分:0)

这相当于埃迪(Eddie)的答案的foreach()(我发现它更易于阅读/维护)。

代码:(Demo

$myArray = [
    ['code' => '1', 'room' => ['name' => 'Room-A']],
    ['code' => '1', 'room' => ['name' => 'Room-B']],
    ['code' => '2', 'room' => ['name' => 'Vip-1']],
    ['code' => '2', 'room' => ['name' => 'Vip-2']]
];
foreach ($myArray as $row) {
    if (!isset($result[$row['code']])) {
        $result[$row['code']] = ['code' => $row['code'], 'room' => [$row['room']]];
        //                                                         ^------------^-- pushed deeper
    } else {
        $result[$row['code']]['room'][] = $row['room'];
        //                           ^^-- pushed deeper
    }
}
var_export(array_values($result));

此问题与许多现有问题想要按特定列分组。我找不到确切的重复项,因为此问题的要求是创建一个更深的结构以包含room子数组。

我通常会这样写:

if (!isset($result[$row['code']])) {
    $result[$row['code']] = $row;

减少语法,但是新的输出结构必须同时应用于ifelse

为避免按键重复/冲突,需要将房间子阵列推入/索引到较低级别。

最后,该技术已在StackOverflow上进行了很多次演示。您可以将元素值作为分组依据,并在迭代输入数组时将该值用作临时键。检查临时密钥是否存在是确定组是新的还是以前遇到的最快方法。完成后,调用array_values()删除临时键(重新索引数组)。