将行分组在一列上并与另一列形成嵌套子数组

Group rows on one column and form nested subarray with other column

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

    $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']]];
    }
}

试试这个代码

$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 数组中

使用 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));