我有一个包含两个项的数组,这两个项也是数组本身:productcountries.

有些情况下,countries数组对于多个产品是相同的,如下例中的basicpro.


给定此数组:

$array = [

    [
        'product'   => [
            'value' => 'basic',
            'label' => 'Basic'
        ],
        'countries'  => [
            'Japan', // these
            'Korea'  // two...
        ],
    ],

    [
        'product'   => [
            'value' => 'pro',
            'label' => 'Pro'
        ],
        'countries'  => [
            'Japan', // ...and these two
            'Korea'  // are identical...
        ],
    ],

    [
        'product'   => [
            'value' => 'expert',
            'label' => 'Expert'
        ],
        'countries'  => [
            'Japan',
            'France'
        ],
    ]

];

我想创建按countries分组的新数组,更准确地说,

这就是我想要的结果:

$array = [

    [
        'product'   => [
            [
                'value' => 'basic',
                'label' => 'Basic'
            ],
            [
                'value' => 'pro',
                'label' => 'Pro'
            ]
        ],
        'countries'  => [
            'Japan', // ...so they are now one single array
            'Korea'  // as the two products 'basic' and 'pro' have been grouped
        ],
    ],

    [
        'product'   => [
            'value' => 'expert',
            'label' => 'Expert'
        ],
        'countries'  => [
            'Japan',
            'France'
        ],
    ]

];

正如您在第二个代码片段中看到的,我要做的是将basicpro分组到同一数组中,因为它们都共享完全相同的countries(KoreaJapan).

几天来,我一直在try 使用这段代码,但它似乎只有在productcountries是字符串而不是数组的情况下才能起作用:

$grouped = array();
foreach ($array as $element) {
    $grouped[$element['countries']][] = $element;
}
var_dump($grouped);

推荐答案

这可能就是你想要的

$productsByCountrySet = [];
foreach ($array as $product) {
    $countries = $product['countries'];
    sort($countries);
    $countrySet = implode('/', $countries);
    if (isset($productsByCountrySet[$countrySet])) {
        $productsByCountrySet[$countrySet]['product'][] = $product['product'];
    } else {
        $productsByCountrySet[$countrySet] = [
            'product' => [$product['product']],
            'countries' => $countries,
        ];
    }
}
$products = [];
foreach ($productsByCountrySet as $p) {
    if (count($p['product']) == 1) {
        $p['product'] = $p['product'][0];
    }
    $products[] = $p;
}
print_r($products);

它会产生您想要的输出.它假定国家的顺序不重要(即[‘Japan’,‘Korea’]与[‘Korea’,‘Japan’]相同)

它的工作原理是将您的国家/地区数组转换为字符串([‘Japan’,‘Korea’]变为‘Japan/Korea’),然后将其用作条目的唯一键.它首先组装唯一键(我称之为‘Country Set’),然后判断它是否已经被看到,从而构建所需的输出array.如果有,则追加产品;如果没有,则将新项添加到输出数组中.

最后一节处理一个国家/地区集只有一个产品的情况.我们循环并捕获此状态,并相应地修改输出.

Php相关问答推荐

获得客户S在WooCommerce为期1年的总支出

在Laravel中,如果我用session—put()存储一些信息,客户端浏览器是否可以使用这些信息?>

Laravel 10 -扩展现有的artisan命令?

使用正则表达式搜索两个子字符串(没有重叠/共享字符)

在WooCommerce我的帐户部分添加带有自定义链接的自定义菜单项

Php解压缩deflate64

MULTI UPDATE Laravel为什么只能更新我的第一行

PHP MySQL求和子树并与父树累加

从订单项目中获取ACF WooCommerce产品价值

WHERE方法不能与有效查询Laravel一起使用

如何在Livewire 3 Form类中做依赖注入?

如何使用MS Graph PHP SDK V2下载文件

如果日期是过go 日期,则隐藏事件发布类型

PHP Match如何准确判断条件?

添加不存在的订单元数据以扩展WooCommerce针对特定产品的管理订单搜索

Mac 上安装 php 时出现 Homebrew 错误

如何在laravel中获得两个时间戳之间的小时和分钟差异

如何使用 AJAX、PHP 和 MYSQL 在 Select 项目时在文本框中填充数据

如何设置Mailersend PHP API 模板变量?

如何在php中获取大于50的年龄