You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP多维数组去重:移除跨分类的重复产品数据

移除PHP多维数组中跨分类的重复产品

我有一个通过$products[] = $product[$category_id][$product_id]生成的多维数组,数组结构如下:

$products = array(
    33 => array(
        31 => array(
            'model' => 'Product 4',
            'product_id' => 31,
            'sku' => '',
            'ean' => '1234',
            'price' => '80.0000'
        ),
        8733 => array(
            'model' => 'qqq',
            'product_id' => 8733,
            'sku' => '',
            'ean' => '1000',
            'price' => '344.6281'
        )
    ),
    25 => array(
        30 => array(
            'model' => 'Product 3',
            'product_id' => 30,
            'sku' => '',
            'ean' => '250',
            'price' => '50.4132'
        ),
        31 => array(
            'model' => 'Product 4',
            'product_id' => 31,
            'sku' => '',
            'ean' => '1234',
            'price' => '80.0000'
        )
    )
);

需要移除数组内的重复产品(无论产品所属分类),最终结果需如下:

$products = array(
    33 => array(
        8733 => array(
            'model' => 'qqq',
            'product_id' => 8733,
            'sku' => '',
            'ean' => '1000',
            'price' => '344.6281'
        )
    ),
    25 => array(
        30 => array(
            'model' => 'Product 3',
            'product_id' => 30,
            'sku' => '',
            'ean' => '250',
            'price' => '50.4132'
        ),
        31 => array(
            'model' => 'Product 4',
            'product_id' => 31,
            'sku' => '',
            'ean' => '1234',
            'price' => '80.0000'
        ),
    )
);

我尝试了以下代码,但无法实现需求:

$cleared_products = array();

foreach ($products as $category_id => $category_products) {
    foreach ($category_products as $product_id => $product) {
        if (isset($cleared_products[$category_id][$product_id])) {
            
            unset($products[$category_id][$product_id]);
        } else {
            
            $cleared_products[$category_id][$product_id] = $product;
        }
    }
}

补充说明:因需生成符合接收方规则的XML,要求产品不能重复,无论所属分类。


解决方案

你的代码只检查了当前分类下是否存在该产品ID,没有全局追踪所有已出现的产品ID,所以无法实现跨分类去重。要解决这个问题,需要用一个全局数组记录所有已经保留的产品ID,遍历过程中判断当前产品是否已被记录:

// 全局记录已保留的产品ID
$seen_product_ids = [];

// 遍历分类,使用引用修改原数组
foreach ($products as $category_id => &$category_products) {
    // 遍历分类下的每个产品
    foreach ($category_products as $product_id => $product) {
        // 如果产品ID已存在,删除当前产品
        if (in_array($product_id, $seen_product_ids)) {
            unset($products[$category_id][$product_id]);
        } else {
            // 否则记录该产品ID
            $seen_product_ids[] = $product_id;
        }
    }
    
    // 可选:如果分类下没有产品了,删除空分类节点
    if (empty($category_products)) {
        unset($products[$category_id]);
    }
}

// 解除引用,避免后续操作意外修改数组
unset($category_products);

代码说明

  • $seen_product_ids:全局数组,用来存储所有已经被保留的产品ID,确保同一个产品不会在任何分类中重复出现。
  • 使用&$category_products引用遍历,直接修改原数组,不需要额外创建新数组。
  • 可选的空分类删除:如果生成XML时不允许空分类节点,可以保留这段代码;如果需要保留空分类,直接删除该判断即可。

内容的提问来源于stack exchange,提问作者K. B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:34:55