Создайте массив с этим выражением $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. И забавно, что некоторые ставят "-", не понимая сути вопроса :)
it's funny that some people put "-" without understanding the essence of the question
... ну, честно говоря, вы не вложили в вопрос "суть вопроса", так чего вы ожидаете? Люди голосуют за то, что они видят, а не за то, о чем вы никогда не упоминали. Если этот момент, касающийся XML, вы считаете важной частью контекста, которая может повлиять на решение, то он должен был быть там с самого начала. По крайней мере, вам следует отредактировать свой пост сейчас, чтобы включить его, а не прятать в комментариях :-)
@К.Б. если категории не важны, возможно, лучше сначала сгладить массив, а затем удалить дубликаты. При необходимости вы всегда можете добавить Category_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;
}
}
}
Важное примечание: вы не можете контролировать, из какой категории будет отфильтрован элемент.
Таким образом, ожидаемый результат не соответствует этому коду. Если вы определите приоритет категорий и отсортируете их по этому признаку, вы сможете удалить их там, где захотите.
Решение
$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
Объяснение:
$uniqueProducts
, чтобы хранить товары без дубликатов.$products
.$uniqueProducts
, сравнив его product_id
и детали.$uniqueProducts
.Написание собственного цикла in_array вместо использования функции настоятельно не рекомендуется. Особенно, когда он уже вложен в два других элемента.
@Wimanicesir Я согласен. Рекомендуется использовать in_array
, так как это может быть более эффективно. Я собирался обновить свое решение, но заметил, что наши ответы будут практически идентичными, поэтому решил оставить все как есть.
Попробуйте это stackoverflow.com/questions/307674/…