У меня есть три массива, как показано ниже:
$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
)
)
Пожалуйста, порекомендуйте. Спасибо.






Похоже, вы используете 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/…
Связанное вами решение использует именованные ключи ($outUnique[$curPid] = $entry;) для заполнения массива результатов. :) Как было сказано ранее, возможно, вам стоит использовать их для хранения ваших продуктов, ключ к одному продукту. (Вставленная ссылка искажена.)
Похоже, у ваших товаров нет уникального ключа (один и тот же
supplier_nameи один и тот жеproduct_codeмогут быть у нескольких продуктов). Будет менее болезненно иметь уникальный ключ для каждого продукта, ваша проблема станет намного проще.