如何将数组的数组转换为包含键和值的分组数组?



以下是输入数组:

$input = [
[
'id' => 96,
'shipping_no' => 212755-1,
'part_no' => 'reterty',
'description' => 'tyrfyt',
'packaging_type' => 'PC'
],
[
'id' => 96,
'shipping_no' => 212755-1,
'part_no' => 'dftgtryh',
'description' => 'dfhgfyh',
'packaging_type' => 'PC'
],
[
'id' => 97,
'shipping_no' => 212755-2,
'part_no' => 'ZeoDark',
'description' => 's%c%s%c%s',
'packaging_type' => 'PC'
]
];

我想把上面的内容转换成这样:

$output = [
[
'key' => 96, 
'value' => [
[
'shipping_no' => 212755-1, 
'part_no' => 'reterty', 
'description' => 'tyrfyt', 
'packaging_type' => 'PC'
], 
[
'shipping_no' => 212755-1, 
'part_no' => 'dftgtryh', 
'description' => 'dfhgfyh', 
'packaging_type' => 'PC'
]
]
],
[
'key' => 97, 
'value' => [
[
'shipping_no' => 212755-2, 
'part_no' => 'ZeoDark', 
'description' => 's%c%s%c%s', 
'packaging_type' => 'PC'
]
]
]
];

我试着像这样实现它:

$result = [];
foreach ($input as $value) {
$result[] = ['key' => $value['id'], 'value' => ['shipping_no' => $value['shipping_no'], 'part_no' => $value['part_no'], 'description' => $value['description'], 'packaging_type' => $value['packaging_type']]];
}

没有根据公共键进行分组。请告诉我解决这个问题可能采取的方法。

我可以看到您已经很好地构建了新的子数组结构,但是分组应该放在第一位,并且由于分组是如何使用临时键完成的,因此可以简化重构代码。

代码(演示):

$result = [];
foreach ($input as $row) {
$id = $row['id'];
unset($row['id']);
if (isset($result[$id])) {
$result[$id]['value'][] = $row;
} else {
$result[$id] = [
'key' => $id,
'value' => [$row]
];
}
}
var_export(
array_values($result)
);

说明过程:

  1. 在迭代输入数组时,缓存每一行遇到的数据的id
  2. 因为你不希望在你的value子数组中保留$row['id'],你现在可以安全地从$row中删除该元素。
  3. 然后检查当前$idisset($result[$id])是否存在一个组。
  4. 如果组已经存在,那么你只需要将$row数据作为一个新的索引行推入组的value子数组。
  5. 如果组不存在,则需要声明/填充所有所需的结构。这意味着必须声明key元素,并且必须声明value子数组的第一个条目。
  6. 最后,如果你不想要第一级键删除它们与array_values()

最新更新