【问题标题】:Group rows on one column and form nested subarray with other column在一列上对行进行分组,并与另一列形成嵌套子数组
【发布时间】:2021-08-06 12:44:05
【问题描述】:

这是我试图处理的事情 我有一个看起来像这样的数组并且有重复

    $products = [
[
    "product_name" => "Adidas1",
    "address" => "street 2"
],
[
    "product_name" => "Adidas2",
    "address" => "street 2"
],
[
    "product_name" => "Adidas3",
    "address" => "street 2"
],
[
    "product_name" => "Adidas4",
    "address" => "street 2"
],
[
    "product_name" => "Nike1",
    "address" => "street name1"
],
[
    "product_name" => "Nike2",
    "address" => "street name1"
]];

我需要得到的结果如下。 我确实尝试了不同的方法来做到这一点,但仍然可以把它带到必须出现的精细结果

$final_result = [
[
    "address" => "street 2",
    "products" => [
        "addidas1",
        "addidas2",
        "addidas3",
        "addidas4",
        
    ]
],
[
    "address" => "street name1",
    "products" => [
        "Nike1",
        "Nike2",
       

    ]
]

有什么建议吗?

这是我尝试过的最佳解决方案

$stor_sorted = array();
foreach ($products as $product) {
    if (array_count_values($product) > 1) {
        $stor_sorted[] = ["address" => $product['address'], "items" => [$product['product_name']]];
    }
}

【问题讨论】:

    标签: php arrays grouping


    【解决方案1】:

    试试这个代码

    $products = [
            [
                "product_name" => "Adidas1",
                "address" => "street 2"
            ],
            [
                "product_name" => "Adidas2",
                "address" => "street 2"
            ],
            [
                "product_name" => "Adidas3",
                "address" => "street 2"
            ],
            [
                "product_name" => "Adidas4",
                "address" => "street 2"
            ],
            [
                "product_name" => "Nike1",
                "address" => "street name1"
            ],
            [
                "product_name" => "Nike2",
                "address" => "street name1"
            ]];
    
        $final_result = [];
        foreach ($products as $pr){
            $original_key = array_search($pr['address'], array_column($final_result, 'address'), true);
            if($original_key === false){
                $temp_array['address'] = $pr['address'];
                $temp_array['products'] =  [$pr['product_name']];
                $final_result[] =$temp_array;
            }else{
                $final_result[$original_key]['products'][] = $pr['product_name'];
            }
        }
    

    您的结果将在 final_result 数组中

    【讨论】:

    • 请不要在 Stack Overflow 上发布纯代码答案。在循环中执行可能的全阵列扫描不是最佳做法。
    【解决方案2】:

    使用address 值作为结果数组中的临时键。

    当第一次遇到地址时,将产品名称转换为行内的数组并存储该行。

    在随后的遭遇中,只需将产品名称推送到组的子数组中。

    完成后,使用array_values() 重新索引结果。

    代码:(Demo)

    $result = [];
    foreach ($products as $row) {
        if (!isset($result[$row['address']])) {
            $row['product_name'] = (array)$row['product_name'];
            $result[$row['address']] = $row;
        } else {
            $result[$row['address']]['product_name'][] = $row['product_name'];
        }
    }
    var_export(array_values($result));
    

    【讨论】:

    • @some 为什么您接受了一个性能较差且无法解释的答案?你不明白我的回答吗?
    猜你喜欢
    • 2018-02-21
    • 2018-05-22
    • 2014-10-20
    • 2021-04-29
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    相关资源
    最近更新 更多