按一列对子数组进行分组,使组内其他列的值以逗号分隔
Group subarrays by one column, make comma-separated values from other column within groups
我有一个如下所示的数组:
$array = [
["444", "0081"],
["449", "0081"],
["451", "0081"],
["455", "2100"],
["469", "2100"]
];
我需要分组为一个新数组,如下所示:
array (
0 =>
array (
0 => '444,449,451',
1 => '0081',
),
1 =>
array (
0 => '455,469',
1 => '2100',
),
)
我尝试了很多脚本,但都没有成功。
function _group_by($array, $key) {
$return = array();
foreach($array as $val) {
$return[$val[$key]][] = $val;
}
return $return;
}
$newArray = _group_by($array, 1); // (NO SUCCESS)
应该有更优雅的解决方案,但我能想到的最简单的就是这个。
// The data you have pasted in the question
$data = [];
$groups = [];
// Go through the entire array $data
foreach($data as $item){
// If the key doesn't exist in the new array yet, add it
if(!array_key_exists($item[1], $groups)){
$groups[$item[1]] = [];
}
// Add the value to the array
$groups[$item[1]][] = $item[0];
}
// Create an array for the data with the structure you requested
$structured = [];
foreach($groups as $group => $values){
// With the array built in the last loop, implode it with a comma
// Also add the 'key' from the last array to it ($group)
$structured[] = [implode(',', $values), $group];
}
我还没有对此进行测试,但类似的东西应该可以解决问题。这简单地遍历给定的数组并以结构化的方式收集所有条目(因此 $groups
变量将包含每个组共享一个键的数组条目,并且该键将对应于给定中每个项目中的第二个项目大批)。从那里开始,它只是关于重组它以获得您所要求的格式。
写两个循环对于这个任务来说太费力了。在迭代时将 isset()
与应用于输出数组的临时键一起使用。完成数据分组后,使用 array_values()
.
重新索引输出
代码 (Demo)
$array = [
["444", "0081"],
["449", "0081"],
["451", "0081"],
["455", "2100"],
["469", "2100"]
];
foreach ($array as $row) {
if (!isset($result[$row[1]])) {
$result[$row[1]] = $row; // first occurrence of group, save whole row
} else {
$result[$row[1]][0] .= ',' . $row[0]; // not first occurrence, concat first element in group
}
}
var_export(array_values($result));
输出:
array (
0 =>
array (
0 => '444,449,451',
1 => '0081',
),
1 =>
array (
0 => '455,469',
1 => '2100',
),
)
我有一个如下所示的数组:
$array = [
["444", "0081"],
["449", "0081"],
["451", "0081"],
["455", "2100"],
["469", "2100"]
];
我需要分组为一个新数组,如下所示:
array (
0 =>
array (
0 => '444,449,451',
1 => '0081',
),
1 =>
array (
0 => '455,469',
1 => '2100',
),
)
我尝试了很多脚本,但都没有成功。
function _group_by($array, $key) {
$return = array();
foreach($array as $val) {
$return[$val[$key]][] = $val;
}
return $return;
}
$newArray = _group_by($array, 1); // (NO SUCCESS)
应该有更优雅的解决方案,但我能想到的最简单的就是这个。
// The data you have pasted in the question
$data = [];
$groups = [];
// Go through the entire array $data
foreach($data as $item){
// If the key doesn't exist in the new array yet, add it
if(!array_key_exists($item[1], $groups)){
$groups[$item[1]] = [];
}
// Add the value to the array
$groups[$item[1]][] = $item[0];
}
// Create an array for the data with the structure you requested
$structured = [];
foreach($groups as $group => $values){
// With the array built in the last loop, implode it with a comma
// Also add the 'key' from the last array to it ($group)
$structured[] = [implode(',', $values), $group];
}
我还没有对此进行测试,但类似的东西应该可以解决问题。这简单地遍历给定的数组并以结构化的方式收集所有条目(因此 $groups
变量将包含每个组共享一个键的数组条目,并且该键将对应于给定中每个项目中的第二个项目大批)。从那里开始,它只是关于重组它以获得您所要求的格式。
写两个循环对于这个任务来说太费力了。在迭代时将 isset()
与应用于输出数组的临时键一起使用。完成数据分组后,使用 array_values()
.
代码 (Demo)
$array = [
["444", "0081"],
["449", "0081"],
["451", "0081"],
["455", "2100"],
["469", "2100"]
];
foreach ($array as $row) {
if (!isset($result[$row[1]])) {
$result[$row[1]] = $row; // first occurrence of group, save whole row
} else {
$result[$row[1]][0] .= ',' . $row[0]; // not first occurrence, concat first element in group
}
}
var_export(array_values($result));
输出:
array (
0 =>
array (
0 => '444,449,451',
1 => '0081',
),
1 =>
array (
0 => '455,469',
1 => '2100',
),
)