После изнурительных поисков я обнаружил некоторые похожие проблемы, подобные той, которую я хотел бы решить, но я не мог использовать их ответы.
Вот несколько очень хороших примеров:
Как удалить повторяющиеся значения из многомерного массива в PHP
Как удалить повторяющиеся значения из многомерного массива в PHP
Как удалить повторяющиеся значения из многомерного массива в PHP повторно
Это самый похожий, но ответ почему-то не работает для меня.
Значения массива php-фильтра и удаление дубликатов из многомерного массива
Основным отличием моей проблемы является то, что, хотя люди ищут решение для удаления всего дублированного подмассива из массива, я пытаюсь удалить подмассив, когда только одна пара $ key => $ value подмассива похожа на соответствующая пара другого подмассива. Другие пары могут иметь разные значения или даже одинаковые.
Вот мой массив:
Array(
[0] => Array
(
[0] => AAA
[1] => 500
)
[1] => Array //Won't be delete 'cause [0] is different, although [1] is the same.
(
[0] => BBB
[1] => 500
)
[2] => Array //Will be delete 'cause [0] is the same.
(
[0] => AAA
[1] => 500
)
[3] => Array //Won't be delete 'cause [0] is different.
(
[0] => CCC
[1] => 820
)
[4] => Array
(
[0] => AAA //Will be delete 'cause [0] is the same. [1] is also different.
[1] => 774
)
Как мне удалось удалить эти подмассивы, чтобы у меня был следующий результат:
Array(
[0] => Array
(
[0] => AAA
[1] => 500
)
[1] => Array
(
[0] => BBB
[1] => 500
)
[2] => Array
(
[0] => CCC
[1] => 820
)
Спасибо заранее!
Самое простое решение (на мой взгляд) вместо использования магического array_filter
а также array_map
Ремесло, которое трудно поддерживать, это написать специальную функцию самостоятельно:
$out = [];
$usedKeys = [];
foreach ($in as $element)
{
list ($a, $b) = $element;
if (!isset($usedKeys[$a]))
{
$usedKeys[$a] = true;
$out[]= $element;
}
}
var_dump($out);
Это вернет только те элементы, чей первый элемент пары является уникальным (берется первый, если доступно несколько записей).
Это работает для меня (на основании предоставленной ссылки):
<?php
$items = array(
array(
0 => 'AAA',
1 => 500,
),
array(
0 => 'BBB',
1 => 500,
),
array(
0 => 'AAA',
1 => 500,
),
array(
0 => 'CCC',
1 => 820,
),
array(
0 => 'AAA',
1 => 774,
),
);$taken = array();
foreach($items as $key => $item) {
if(!in_array($item[0], $taken)) {
$taken[] = $item[0];
} else {
unset($items[$key]);
}
}echo '<pre>'.print_r($items,true).'</pre>';