首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用键值在多维数组中移动数组?

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

Stack Overflow用户
提问于 2019-04-06 14:55:07
回答 2查看 175关注 0票数 0

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

代码语言:javascript
复制
$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')));

我尝试使用这样的代码:

代码语言:javascript
复制
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']);
        }
    }

我想要这样的结果:

代码语言:javascript
复制
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
                 )
              )
        )
  )

你知道怎么加入这个数组吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-06 15:01:22

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

代码语言:javascript
复制
$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>";

这将导致:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-04-07 01:10:07

这是埃迪的答案的foreach()等价物(我发现它更容易阅读/维护)。

代码:(Demo)

代码语言:javascript
复制
$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子数组。

通常我会这样写:

代码语言:javascript
复制
if (!isset($result[$row['code']])) {
    $result[$row['code']] = $row;

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

为了避免密钥重复/冲突,需要将房间子数组推送/索引到更低的级别。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55546628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档