根据共享列值对关联行数据进行分组
Group associative row data based on shared column value
我有一个多维数组,如:
Array
(
[0] => Array
(
[division] => Mymensingh
[A] => 1
)
[1] => Array
(
[division] => Dhaka
[A] => 5
)
[2] => Array
(
[division] => Mymensingh
[B] => 2
[C] => 5
)
)
我需要找到具有匹配 division
值的行并将它们合并到一个数组中。
从这个数组中,我希望输出为:
Array
(
[0] => Array
(
[division] => Mymensingh
[A] => 1
[B] => 2
[C] => 5
)
[1] => Array
(
[division] => Dhaka
[A] => 5
)
)
子数组中的键可以不同,子数组的元素数量也可以不同。
我能想到的唯一解决方案如下。当然可能还有其他可行的解决方案,但我给出了一个。
$array = array(
'0' => array (
'division' => 'Mymensingh',
'A' => 1
),
'1' => array (
'division' => 'Dhaka',
'A' => 5
),
'2' => array (
'division' => 'Mymensingh',
'B' => 2,
'C' => 5
),
);
$result = array();
foreach ($array as $arr) {
if (!is_array($result[$arr['division']])) $result[$arr['division']] = array();
foreach ($arr as $key => $value) {
$result[$arr['division']][$key] = $value;
}
}
echo "<pre>"; print_r($result);
以上代码为您提供了所需的输出。请试一试。
希望对您有所帮助。
我觉得比较简单,就是遍历数组,不断合并"division":
分隔的条目
function mergeByDiscriminator($input, $discriminator = 'division') {
$result = [];
foreach ($input as $array) {
$key = $array[$discriminator];
$result[$key] = array_merge(
array_key_exists($key, $result) ? $result[$key] : [],
$array
);
}
return array_values($result);
}
$result = mergeByDiscriminator($input); // $input is your array
由于空合并运算符和联合运算符,此任务以零迭代函数调用简洁地完成。
将每个迭代行与该键控组中预先存在的数据合并。如果尚未遇到键控组,则将该行与空数组合并。
联合运算符在本例中为 suitable/reliable,因为它将一个关联数组写入另一个关联数组。
语言构造迭代:(Demo)
$result = [];
foreach ($array as $row) {
$result[$row['division']] = ($result[$row['division']] ?? []) + $row;
}
var_export(array_values($result));
函数迭代:(Demo)
var_export(
array_values(
array_reduce(
$array,
function($result, $row) {
$result[$row['division']] = ($result[$row['division']] ?? []) + $row;
return $result;
},
[]
)
)
);
我有一个多维数组,如:
Array
(
[0] => Array
(
[division] => Mymensingh
[A] => 1
)
[1] => Array
(
[division] => Dhaka
[A] => 5
)
[2] => Array
(
[division] => Mymensingh
[B] => 2
[C] => 5
)
)
我需要找到具有匹配 division
值的行并将它们合并到一个数组中。
从这个数组中,我希望输出为:
Array
(
[0] => Array
(
[division] => Mymensingh
[A] => 1
[B] => 2
[C] => 5
)
[1] => Array
(
[division] => Dhaka
[A] => 5
)
)
子数组中的键可以不同,子数组的元素数量也可以不同。
我能想到的唯一解决方案如下。当然可能还有其他可行的解决方案,但我给出了一个。
$array = array(
'0' => array (
'division' => 'Mymensingh',
'A' => 1
),
'1' => array (
'division' => 'Dhaka',
'A' => 5
),
'2' => array (
'division' => 'Mymensingh',
'B' => 2,
'C' => 5
),
);
$result = array();
foreach ($array as $arr) {
if (!is_array($result[$arr['division']])) $result[$arr['division']] = array();
foreach ($arr as $key => $value) {
$result[$arr['division']][$key] = $value;
}
}
echo "<pre>"; print_r($result);
以上代码为您提供了所需的输出。请试一试。
希望对您有所帮助。
我觉得比较简单,就是遍历数组,不断合并"division":
分隔的条目function mergeByDiscriminator($input, $discriminator = 'division') {
$result = [];
foreach ($input as $array) {
$key = $array[$discriminator];
$result[$key] = array_merge(
array_key_exists($key, $result) ? $result[$key] : [],
$array
);
}
return array_values($result);
}
$result = mergeByDiscriminator($input); // $input is your array
由于空合并运算符和联合运算符,此任务以零迭代函数调用简洁地完成。
将每个迭代行与该键控组中预先存在的数据合并。如果尚未遇到键控组,则将该行与空数组合并。
联合运算符在本例中为 suitable/reliable,因为它将一个关联数组写入另一个关联数组。
语言构造迭代:(Demo)
$result = [];
foreach ($array as $row) {
$result[$row['division']] = ($result[$row['division']] ?? []) + $row;
}
var_export(array_values($result));
函数迭代:(Demo)
var_export(
array_values(
array_reduce(
$array,
function($result, $row) {
$result[$row['division']] = ($result[$row['division']] ?? []) + $row;
return $result;
},
[]
)
)
);