8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

从多维数组中删除重复项

Michael Butscher 2月前

31 0

有一个具有以下表达式的数组 $products[] = $product[$category_id][$product_id]:$products = array( 33 => array( 31 => array( 'model' => 'Product 4', ...

有一个具有以下表达式的数组 $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'
        )
    )
);

我需要在 php 中删除重复的产品,结果必须是:

$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 并且任何产品都不能重复。它们属于不同的类别并不重要。XML 收件人规则...

帖子版权声明 1、本帖标题:从多维数组中删除重复项
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Michael Butscher在本站《arrays》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @Wimanicesir 我同意。建议使用 in_array,因为它可能更有效。我正要更新我的解决方案,但我注意到我们的答案几乎相同,所以我决定保持原样。

  • 强烈建议不要编写自己的“in_array”循环而不是使用函数。尤其是当它已经嵌套在其他两个 foreach 中时。

  • 解决方案

    $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'
            )
        )
    );
    
    // Create a new array to store unique products
    $uniqueProducts = array();
    
    foreach ($products as $parentKey => $items) {
        foreach ($items as $productId => $product) {
            $found = false;
            // Check if the product already exists in the uniqueProducts array
            foreach ($uniqueProducts as $existingItems) {
                if (isset($existingItems[$productId]) && $existingItems[$productId] == $product) {
                    $found = true;
                    break;
                }
            }
            // If the product is not found, add it to the uniqueProducts array
            if (!$found) {
                $uniqueProducts[$parentKey][$productId] = $product;
            }
        }
    }
    
    // Output the unique products array
    print_r($uniqueProducts);
    

    输出

    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
                    )
    
            )
    
    )
    

    在线处决 3v4l

    解释

    1. 名为的 新数组 $uniqueProducts 用于存储没有重复的产品。
    2. 循环遍历 原始 $products 数组中的每个产品。
    3. 通过比较其 检查该产品是否 $uniqueProducts 已经存在 product_id
    4. 如果未找到该产品 (即不是重复的),则将其添加到 $uniqueProducts .
    5. 最终结果 是仅包含唯一产品的数组,保持与原始数组相同的结构。
  • 您的代码存在问题,因为您检查了产品是否存在于其类别中。在您的示例中,重复的产品属于两个类别。

    我们可以通过跟踪您添加的 ID 轻松地进行调整。

    $cleared_products = array();
    $productIds = array();
    
    foreach ($products as $category_id => $category_products) {
        foreach ($category_products as $product_id => $product) {
            if (in_array($product_id, $productIds)) {
                continue;
            } else {
                $productIds[] = $product_id;
                $cleared_products[$category_id][$product_id] = $product;
            }
        }
    }
    

    重要提示:你无法控制项目将被过滤到哪个类别

    所以预期结果匹配。如果您定义类别的优先级并以此进行排序,则可以在需要的地方将其删除。

  • @KB 如果类别不重要,最好先将数组展平,然后再删除重复项。如果需要,您可以随时为产品添加 category_id。

  • ...好吧,老实说,你没有把“问题的本质”写进问题里,那你还能指望什么呢?人们投票是看他们能看到的,而不是你从未提到的东西。如果你认为关于 XML 的这一点是可能影响解决方案的重要背景,那么它应该在一开始就存在。至少你应该

返回
作者最近主题: