根据共享列值对关联行数据进行分组

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;
            },
            []
        )
    )
);