Laravel数组合并为嵌套数组

时间:2017-09-02 21:05:35

标签: php arrays

给定这样的数组结构:

array:3 [
  0 => array:1 [
    0 => {#259
      +"user_id": 2
    }
  ]
  1 => array:2 [
    0 => {#254
      +"user_id": 1

    }
    1 => {#252
      +"user_id": 1
    }
  ]
  2 => array:2 [
    0 => {#258
      +"user_id": 2
    }
    1 => {#255
      +"user_id": 2
    }
  ]
]

这样的第二个数组:

array:5 [
  0 => false
  1 => true
  2 => true
  3 => false
  4 => false
]

我想合并这两个数组,所以我得到了这个结果:

array:3 [
      0 => array:1 [
        0 => {#259
          +"user_id": 2
          +"is_admin": false

        }
      ]
      1 => array:2 [
        0 => {#254
          +"user_id": 1
          +"is_admin": true

        }
        1 => {#252
          +"user_id": 1
          +"is_admin": true
        }
      ]
      2 => array:2 [
        0 => {#258
          +"user_id": 2
          +"is_admin": false
        }
        1 => {#255
          +"user_id": 2
          +"is_admin": false
        }
      ]
    ]

我不知道如何在第一个数组是嵌套数组时循环,第二个数组作为一个简单的数组给出。我尝试使用array_merge,但它对我的逻辑没有正常工作。

2 个答案:

答案 0 :(得分:1)

我认为你无法实现这一点,因为阵列非常不同。由于它们的大小不同array_merge无法正常工作。另外,第一个数组是多维的,而第二个数组是单维的。

如果你100%确定数组a和b的索引之间的映射,你可以创建一个循环如下,假设$array1是多维数组而$ array2是包含{{1的平面数组}和true

false

或以更简单的格式:

$index = 0;
$final = array_map(function ($top_level_entry) {
  return array_map(function ($item) {
    global $index, $array2;

    $item['is_admin'] = $array2[$index];
    $index++; 
    return $item;
  }, $top_level_entry);
}, $array1);

答案 1 :(得分:1)

您可以使用array_walk_recursive功能:

array_walk_recursive($users, function (&$user) use (&$is_admin) {
    $user->is_admin = current($is_admin);
    next($is_admin);
});

注意$user$is_admin都是通过引用传递的。

此外,您可以使用外部索引变量(即$i)来跟踪$is_admin位置。在这种情况下,您需要传递(更准确地说是enclose$i$is_admin一起,只有$i将通过引用和$is_admin传递按价值。我决定利用currentnext函数,而不是再引入一个变量。

这是working demo

一件重要的事情。如果您的$is_admin数组的元素数量少于$users数组(实际上是实际的数量),则false值将分配给那些用户之后的is_admin字段。 $is_admin中没有剩余元素。