Объединение двух массивов с сохранением одной версии объединенного элемента в соответствии с его свойствами

У меня есть три массива, как показано ниже:

    $one = array (
        array (
            'supplier_name' => 'SUP1',
            'product_code' => 'ITM001',
            'product' => 'Book',
            'price' => '5500',
        ),
        array (
            'supplier_name' => 'SUP1',
            'product_code' => 'ITM002',
            'product' => 'Pencil',
            'price' => '1500',
        ),
        array (
            'supplier_name' => 'SUP1',
            'product_code' => 'ITM002',
            'product' => 'Eraser',
            'price' => '1750',
        ),
    )

    $two = array (
        array (
            'supplier_name' => 'SUP2',
            'product_code' => 'SP001',
            'product' => 'Book',
            'price' => '5250',
        ),
        array (
            'supplier_name' => 'SUP2',
            'product_code' => 'SP002',
            'product' => 'Pencil',
            'price' => '1550',
        ),
        array (
            'supplier_name' => 'SUP2',
            'product_code' => 'SP002',
            'product' => 'Ruler',
            'price' => '2300',
        ),
    )

    $three = array (
        array (
            'supplier_name' => 'SUP3',
            'product_code' => 'BRG01',
            'product' => 'Book',
            'price' => '5250',
        ),
        array (
            'supplier_name' => 'SUP3',
            'product_code' => 'BRG02',
            'product' => 'Ruler',
            'price' => '2350',
        ),
        array (
            'supplier_name' => 'SUP3',
            'product_code' => 'BRG02',
            'product' => 'Drawing book',
            'price' => '4500',
        ),
    )

Я уже объединил весь вышеуказанный массив с array_merge.

$all_array = array (
  0 => 
  array (
    'supplier_name' => 'SUP1',
    'product_code' => 'ITM001',
    'product' => 'Book',
    'price' => '5500',
  ),
  1 => 
  array (
    'supplier_name' => 'SUP1',
    'product_code' => 'ITM002',
    'product' => 'Pencil',
    'price' => '1500',
  ),
  2 => 
  array (
    'supplier_name' => 'SUP1',
    'product_code' => 'ITM002',
    'product' => 'Eraser',
    'price' => '1750',
  ),
  3 => 
  array (
    'supplier_name' => 'SUP2',
    'product_code' => 'SP001',
    'product' => 'Book',
    'price' => '5250',
  ),
  4 => 
  array (
    'supplier_name' => 'SUP2',
    'product_code' => 'SP002',
    'product' => 'Pencil',
    'price' => '1550',
  ),
  5 => 
  array (
    'supplier_name' => 'SUP2',
    'product_code' => 'SP002',
    'product' => 'Ruler',
    'price' => '2300',
  ),
  6 => 
  array (
    'supplier_name' => 'SUP3',
    'product_code' => 'BRG01',
    'product' => 'Book',
    'price' => '5250',
  ),
  7 => 
  array (
    'supplier_name' => 'SUP3',
    'product_code' => 'BRG02',
    'product' => 'Ruler',
    'price' => '2350',
  ),
  8 => 
  array (
    'supplier_name' => 'SUP3',
    'product_code' => 'BRG02',
    'product' => 'Drawing book',
    'price' => '4500',
  ),
)

Как я могу удалить дубликат с более высоким значением и получить только более низкую цену на все товары.

Array
(
    [0] => Array
        (
            [supplier_name] => SUP2
            [product_code] => SP001
            [product] => Book
            [price] => 5250
        )

    [1] => Array
        (
            [supplier_name] => SUP1
            [product_code] => ITM002
            [product] => Pencil
            [price] => 1500
        )

    [2] => Array
        (
            [supplier_name] => SUP1
            [product_code] => ITM002
            [product] => Eraser
            [price] => 1750
        )

    [3] => Array
        (
            [supplier_name] => SUP2
            [product_code] => SP002
            [product] => Ruler
            [price] => 2300
        )

    [4] => Array
        (
            [supplier_name] => SUP3
            [product_code] => BRG02
            [product] => Drawing book
            [price] => 4500
        )

)

Пожалуйста, порекомендуйте. Спасибо.

Похоже, у ваших товаров нет уникального ключа (один и тот же supplier_name и один и тот же product_code могут быть у нескольких продуктов). Будет менее болезненно иметь уникальный ключ для каждого продукта, ваша проблема станет намного проще.

Amessihel 18.10.2018 14:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
4
1
36
1

Ответы 1

Похоже, вы используете PHP. Хотя было бы лучше и менее болезненно сопоставить ваши продукты с помощью уникального именованного ключа, вот способ решения вашей проблемы.

Не используйте array_merge, поскольку он не позволяет использовать обратный вызов, чтобы сохранить только более дешевый продукт.

Вот псевдокод, который вы могли бы использовать (вместо непроверенного php, который я бы предоставил). Адаптируйте его к своему исходному коду.

// Everything has a beginning.
array_result = array()

// Browsing array1
For each item of array1
    found_item = false
    // For each product of array1, seeking for the same product in array2
    For each item2 of array2
        If areTheSameProduct(item1, item2)
            If item1.price < item2.price Then
                appendToArray(array_result, item1)
            Else
                appendToArray(array_result, item2)
            End If
            found_item = true
            // Removing then the product in array2, to let at the end only
            // the ones which was't found in array1.
            // In PHP, use here unset() to remove an element from the array.
            // "key" parameter can be a named index or the classic integer one
            unset(array1[key of item2])
            Break // No need to continue the loop on array2
        End If
    End For
    // Item not found in array2? We'll keep the one of array1.
    If (Not found_item) Then appendToArray(array_result, item1)
End For

// For the remaining values of array_two (which were not in array1)
For each item2 of array2
  appendToArray(array_result, item2 )
End For

// Comparator function
Function areTheSameProduct(item1, item2)
    return (item1.supplier_name == item2.supplier_name) AND
           (item1.product_code  == item2.product_code) AND
           (item1.product       == item2.product)
End Function

Спасибо за совет, у меня уже есть решение для моего случая в stackoverflow.com/questions/28906861/…

Adin Ramdhan 18.10.2018 15:16

Связанное вами решение использует именованные ключи ($outUnique[$curPid] = $entry;) для заполнения массива результатов. :) Как было сказано ранее, возможно, вам стоит использовать их для хранения ваших продуктов, ключ к одному продукту. (Вставленная ссылка искажена.)

Amessihel 18.10.2018 16:51

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