我有一个数组,我想将公共字段组合在一起。 这样,公用名就可以分组在一起,并且包含该特定名的公用值。 下面是我的数组
[
[
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'];
}
答案 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_employee
和count_warehouse
值并将数据合并在一起,则作为替代选择。
这首先创建一个数组,其中包含所有公司名称的列表作为键和一个空数组,然后循环遍历主要数据并将其添加到其中(请注意,当我说添加它时,它将替换当前值如果具有相同的键名,则在数组中使用新值)。
$group = array_fill_keys(array_column($data, "name"), []);
foreach ($data as $key => $value) {
$group [$value['name']] += $value;
}
答案 2 :(得分:0)
您可以将array_walk
与array_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));
答案 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,
),
)