Удалить дубликаты из многомерного массива

Создайте массив с этим выражением $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;
                }
            }
        }

Но не работает...

Попробуйте это stackoverflow.com/questions/307674/…

Weber 28.08.2024 10:20

Я перепробовал все, что нашел здесь, прежде чем публиковать...

K. B. 28.08.2024 10:29

Почему удаленный товар считается дубликатом? Каково правило?

shingo 28.08.2024 10:53

Мне нужно сгенерировать XML, и никакие продукты не могут быть дублированы. Неважно, что они относятся к другой категории. Правила получателя XML. И забавно, что некоторые ставят "-", не понимая сути вопроса :)

K. B. 28.08.2024 11:05
it's funny that some people put "-" without understanding the essence of the question... ну, честно говоря, вы не вложили в вопрос "суть вопроса", так чего вы ожидаете? Люди голосуют за то, что они видят, а не за то, о чем вы никогда не упоминали. Если этот момент, касающийся XML, вы считаете важной частью контекста, которая может повлиять на решение, то он должен был быть там с самого начала. По крайней мере, вам следует отредактировать свой пост сейчас, чтобы включить его, а не прятать в комментариях :-)
ADyson 28.08.2024 11:45

@К.Б. если категории не важны, возможно, лучше сначала сгладить массив, а затем удалить дубликаты. При необходимости вы всегда можете добавить Category_id к своему продукту.

Wimanicesir 28.08.2024 12:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
6
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема с вашим кодом в том, что вы проверяете, существует ли продукт в своей категории. В вашем примере дубликат продукта относится к двум категориям.

Мы можем легко настроить его, отслеживая добавленный вами идентификатор.

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

Важное примечание: вы не можете контролировать, из какой категории будет отфильтрован элемент.

Таким образом, ожидаемый результат не соответствует этому коду. Если вы определите приоритет категорий и отсортируете их по этому признаку, вы сможете удалить их там, где захотите.

Решение

$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. Конечным результатом является массив, содержащий только уникальные продукты, сохраняющий ту же структуру, что и исходный массив.

Написание собственного цикла in_array вместо использования функции настоятельно не рекомендуется. Особенно, когда он уже вложен в два других элемента.

Wimanicesir 28.08.2024 12:50

@Wimanicesir Я согласен. Рекомендуется использовать in_array, так как это может быть более эффективно. Я собирался обновить свое решение, но заметил, что наши ответы будут практически идентичными, поэтому решил оставить все как есть.

Hassaan 28.08.2024 13:28

Другие вопросы по теме