简体   繁体   English

按列值对二维数组进行分组并连接每个组中的值

[英]Group 2d array by column value and concatenate values within each group

I have a simple php array for location postcode and their name.我有一个简单的 php 数组,用于位置邮政编码及其名称。 I want compress 'code' by 'name'.我想按“名称”压缩“代码”。 This code from WooCommerce database zones.此代码来自 WooCommerce 数据库区域。

$new_arr = [
    [
        'name' => 'Jambi Selatan',
        'code' => '36139',
        'code_name' => '36139 - Jambi Selatan'
    ],
    [
        'name' => 'Jambi Selatan',
        'code' => '36137',
        'code_name' => '36137 - Jambi Selatan'
    ],
    [
        'name' => 'Bagan Pete',
        'code' => '36129',
        'code_name' => '36129 - Bagan Pete'
    ],
    [
        'name' => 'Bagan Pete',
        'code' => '36127',
        'code_name' => '36127 - Bagan Pete'
    ]
];

I want get final result combined by 'name' and 'code' like this: i try array_unique method but not working.我想通过这样的“名称”和“代码”组合获得最终结果:我尝试 array_unique 方法但不起作用。

Array (
    [0] => Array
        (
            [name] => Jambi Selatan
            [code] => 36139, 36137
            [code_name] => 36139, 36139 - Jambi Selatan
        )

    [1] => Array
        (
            [name] => Bagan Pete
            [code] => 36127, 36129
            [code_name] => 36127, 36129 - Bagan Pete
        )
)

I try this method, but not fix at 'code_name'我尝试了这种方法,但没有修复“code_name”

$out = array();
foreach ($new_arr as $key => $value){
    if (array_key_exists($value['name'], $out)){
        $out[$value['name']]['code'] .= ', '.$value['code'];
    } else {
        $out[$value['name']] = array(
            'name' => $value['name'],
            'code' => $value['code'],
            'code_name' => $value['code'] . ' - ' . $value['name']
        );
    }
}
$out = array_values($out);               

print_r($out);打印_r($输出);

You have to check duplicate name by in_array and update exist array value .If not exist insert that value to $out array . 您必须通过in_array检查重复的名称并更新存在的数组值。如果不存在,则将该值插入$out array。

$out = array();
foreach($new_arr as $k=>$v) {
    //empty array state
    if(count($out) == 0) {
        $out[] = $v;
        continue;
    }   
    foreach ($out as $key => $value) {
        if(in_array($v["name"],$value)) {
            $out[$key]["code"] .= ",".$v["code"];
            //for the code_name output as OP described
            $nn = explode("-", $value["code_name"]);
            $l = count($nn) - 1;
            unset($nn[$l]);
            $out[$key]["code_name"] = implode($nn).",".$v["code_name"];
            break;
        } else {
            if((count($out)-1) == $key) {
                $out[] = $v;
            }
        }
    }
}
var_dump($out);

For someone have problem like me, this method for fix it: 对于像我这样的人,可以使用以下方法进行修复:

$out = array();
            foreach ($new_arr as $key => $value){
                if (array_key_exists($value['name'], $out)){
                    $out[$value['name']]['code'] .= ', '.$value['code'];
                    $out[$value['name']]['code_name'] .= ', '.$value['code'] . ' - ' . $value['name'];
                } else {
                    $out[$value['name']] = array(
                        'name' => $value['name'],
                        'code' => $value['code'],
                        'code_name' => $value['code']
                    );
                }
            }
            $out = array_values($out);
            print_r($out);

Final result; 最后结果;

Array
(
    [0] => Array
        (
            [name] => Jambi Selatan
            [code] => 36139, 36137
            [code_name] => 36139, 36137 - Jambi Selatan
        )

    [1] => Array
        (
            [name] => Bagan Pete
            [code] => 36129, 36127
            [code_name] => 36129, 36127 - Bagan Pete
        )

)

Please try below one as another approach: 请尝试以下一种方法:

<?php
$arr = Array (
    Array
        (
            'name' => 'Jambi Selatan',
            'code' => '36139',
            'code_name' => '36139 - Jambi Selatan'
        ),
    Array
        (
            'name' => 'Jambi Selatan',
            'code' => '36137',
            'code_name' => '36137 - Jambi Selatan'
        ),
    Array
        (
            'name' => 'Bagan Pete',
            'code' => '36129',
            'code_name' => '36129 - Bagan Pete'
        ),
    Array
        (
            'name' => 'Bagan Pete',
            'code' => '36127',
            'code_name' => '36127 - Bagan Pete'
        )
);

$newarr = array();
$finalArr = array();
foreach($arr as $aa) {
    $newarr[$aa['name']][] = $aa;
}

foreach($newarr as $kk => $bb) {
    foreach($bb as $cc) {
        $finalArr[$kk]['name'] = $cc['name'];

        if(isset($finalArr[$kk]['code'])) {
            $finalArr[$kk]['code'] = $finalArr[$kk]['code'].','.$cc['code'];
        } else {
            $finalArr[$kk]['code'] = $cc['code'];
        }
        if(isset($finalArr[$kk]['code_name'])) {
            $finalArr[$kk]['code_name'] = $finalArr[$kk]['code_name'].','.$cc['code_name'];
        } else {
            $finalArr[$kk]['code_name'] = $cc['code_name'];
        }
    }
}
echo "<pre>";
print_r($finalArr);
echo "</pre>";
?>

Definitely avoid any suggestions that use more than one loop to group and concatenate the data.绝对避免使用多个循环来分组和连接数据的任何建议。

I do endorse @Opsional's snippet.我确实认可@Opsional 的片段。 An alternative approach is to push reference variables into the result array, then only concatenate comma-separated values to the appropriate reference variable.另一种方法是将引用变量推入结果数组,然后仅将逗号分隔值连接到适当的引用变量。

Code: ( Demo )代码:(演示

$result = [];
foreach ($arr as $row) {
    if (!isset($ref[$row['name']])) {
        $ref[$row['name']] = $row;
        $result[] = &$ref[$row['name']];
    } else {
        $ref[$row['name']]['code'] .= ', ' . $row['code'];
        $ref[$row['name']]['code_name'] .= ', ' . $row['code_name'];
    }
}
var_export($result);

For any purist developers that insist on destroying references, call unset($ref) after the loop.对于坚持销毁引用的任何纯粹的开发人员,请在循环后调用unset($ref)


Here is a streamlined version of @Opsional's snippet: ( Demo )这是@Opsional 片段的简化版本:(演示

$result = [];
foreach ($arr as $row) {
    if (!isset($result[$row['name']])) {
        $result[$row['name']] = $row;
    } else {
        $result[$row['name']]['code'] .= ', ' . $row['code'];
        $result[$row['name']]['code_name'] .= ', ' . $row['code_name'];
    }
}
var_export(array_values($result));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将来自两个二维 arrays 的数据按三列分组,并在每组内的另一列中保留最低值 - Group data from two 2d arrays by three columns and retaining the lowest value in another column within each group 2D数组-按值分组并汇总相同键的值 - 2d array - group by value and sum up same keys' values 按二级键对二维数组数据进行分组并计算每组内的平均值 - Group 2d array data by second level keys and calculate average within each group 按一列对二维数组数据进行分组,并对每组中的其他列求和(分别) - Group 2d array data by one column and sum other columns in each group (separately) 按多个列值对数组行进行分组,并对每个组中的另一列求和 - Group array rows by multiple column values and sum another column within each group 使用列值对二维数组数据进行分组以创建 3d 数组 - Group 2d array data using column value to create a 3d array 基于单列对二维数组中的行数据进行分组,并将唯一数据推送到相应的子数组中 - Group row data within a 2d array based on a single column and push unique data into respective subarrays 以 10 行为一组对 2d 数组进行分组,然后对每批中的值求和 - Group 2d array in batches of 10 rows then sum the values in each batch 按 id 列对二维数组进行分组,将数量推入组中,并将数量添加到组中所有先前的数量 - Group 2D array by id column, push amount into group, and add amount to all previous amounts in group 将分组元素添加到 2d 数组并在各自组中求和值 - Add grouping elements to 2d array and sum values in respective group
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM