使用PHP中的字段合并两个数组

时间:2019-05-23 11:15:21

标签: php arrays

我有一个数组,我想将公共字段组合在一起。 这样,公用名就可以分组在一起,并且包含该特定名的公用值。 下面是我的数组

[
  [
    count_employee: 2,
    name: "Harry"
  ],
  [
    count_employee: 61,
    name: "Jack"
  ],
  [
    count_employee: 11,
    name: "John"
  ],
  [
    count_warehouse: 1,
    name: "Harry"
  ],
  [
    count_warehouse: 77,
    name: "John"
  ],
  [
    count_warehouse: 45,
    name: "Jack"
  ]
]

我希望输出为

[
  [
    name: "Harry",
    count_employee:2
    count_warehouse:1
  ],
  [
    name: "Jack",
    count_employee: 61
    count_warehouse: 45
  ],
  [
    name: "John",
    count_employee:11
    count_warehouse:77
  ],
]

到目前为止,我已经尝试过

foreach ($data as $key => $value) {
      $group[$value['name']]['name'] = $value['name'];
      $group[$value['name']][$key]['count_employee'] = $value['count_employee'];
      $group[$value['name']][$key]['count_warehouse'] = $value['count_warehouse'];
}

4 个答案:

答案 0 :(得分:5)

遍历数组,并使用名称作为每个元素的索引。如果不存在该索引中的任何元素,请将其定义为空数组。

然后您需要做的就是将字段(如果存在)添加到适当的列中。

您的问题是,您正在创建一个维数过多的数组,而不是将每个值都添加到当前计数中-此外,您将不会总是为每次迭代都定义仓库和员工数。

$result = [];
foreach ($arr as $v) {
    // Initialize the person
    if (!isset($result[$v['name']])) {
        $result[$v['name']] = ["name" => $v['name'], "count_employee" => 0, "count_warehouse" => 0];
    }
    // Add values
    if (isset($v['count_employee']))
        $result[$v['name']]['count_employee'] += $v['count_employee'];
    if (isset($v['count_warehouse']))
        $result[$v['name']]['count_warehouse'] += $v['count_warehouse'];
}
// print_r($result);

答案 1 :(得分:1)

如果您不需要累积count_employeecount_warehouse值并将数据合并在一起,则作为替代选择。

这首先创建一个数组,其中包含所有公司名称的列表作为键和一个空数组,然后循环遍历主要数据并将其添加到其中(请注意,当我说添加它时,它将替换当前值如果具有相同的键名,则在数组中使用新值)。

$group = array_fill_keys(array_column($data, "name"), []);
foreach ($data as $key => $value) {
    $group [$value['name']] += $value;
}

答案 2 :(得分:0)

您可以将array_walkarray_key_exists一起使用

$res=[];
array_walk($arr, function($v,$k) use (&$res){
 if(array_key_exists($v['name'], $res))
  $res[$v['name']]['count_warehouse'] = $v['count_warehouse'];
 else
  $res[$v['name']] = $v;
});
print_r(array_values($res));

Live Demo

答案 3 :(得分:0)

假设所有数组都有一个用于包含在其中的每个子数组的名称键,我们可以将该名称用作数组的键并合并具有相应名称值的数组。

<?php
$data=
[
  [
    'count_employee'=> 2,
    'name'=> 'Harry'
  ],
  [
    'count_employee'=> 61,
    'name'=> 'Jack'
  ],
  [
    'count_employee'=> 11,
    'name'=> 'John'
  ],
  [
    'count_warehouse'=> 1,
    'name'=> 'Harry'
  ],
  [
    'count_warehouse'=> 77,
    'name'=> 'John'
  ],
  [
    'count_warehouse'=> 45,
    'name'=> 'Jack'
  ]
];

$output = [];
foreach($data as $item) {
    $output[$item['name']] = array_merge($item, $output[$item['name']] ?? []);
}


var_export($output);

输出:

array (
    'Harry' => 
    array (
      'count_warehouse' => 1,
      'name' => 'Harry',
      'count_employee' => 2,
    ),
    'Jack' => 
    array (
      'count_warehouse' => 45,
      'name' => 'Jack',
      'count_employee' => 61,
    ),
    'John' => 
    array (
      'count_warehouse' => 77,
      'name' => 'John',
      'count_employee' => 11,
    ),
  )