Удалить дублированные элементы ассоциативного массива в PHP
$result = array(
0=>array('a'=>1,'b'=>'Hello'),
1=>array('a'=>1,'b'=>'other'),
2=>array('a'=>1,'b'=>'other'),
);
Если он дублируется, удалите его, поэтому результат будет следующим:
$result = array(
0=>array('a'=>1,'b'=>'Hello'),
1=>array('a'=>1,'b'=>'other')
);
Может ли кто-нибудь это знать?
Спасибо
Ответы
Ответ 1
Независимо от того, что предлагают другие пользователи, вы ищете функцию под названием array_unique
Docs. Важно здесь установить второй параметр SORT_REGULAR
, а затем задание легко:
array_unique($result, SORT_REGULAR);
Значение флага SORT_REGULAR
:
сравнить элементы обычно (не менять типы)
И это то, что вы хотите. Вы хотите сравнить массивы Docs здесь и не изменять их тип в строку (которая была бы по умолчанию, если параметр не задан),
array_unique
выполняет строгое сравнение (===
в PHP), для массивов это означает:
$a === $b
TRUE
, если $a и $b имеют одинаковые пары ключ/значение в том же порядке и тех же типах.
Выход (Демо-версия):
Array
(
[0] => Array
(
[a] => 1
[b] => Hello
)
[1] => Array
(
[a] => 1
[b] => other
)
)
Ответ 2
Во-первых, вы не можете использовать plain array_unique
для этой проблемы, потому что array_unique внутренне обрабатывает элементы массива как строки, поэтому "Can not convert Array to String" появятся при использовании array_unique для этого.
Итак, попробуйте следующее:
$result = array(
0=>array('a'=>1,'b'=>'Hello'),
1=>array('a'=>1,'b'=>'other'),
2=>array('a'=>1,'b'=>'other')
);
$unique = array_map("unserialize", array_unique(array_map("serialize", $result)));
print_r($unique);
Результат:
Array
(
[0] => Array
(
[a] => 1
[b] => Hello
)
[1] => Array
(
[a] => 1
[b] => other
)
)
Сериализация очень удобна для таких проблем.
Если вы чувствуете, что слишком много магии для вас, ознакомьтесь с этим сообщением
function array_multi_unique($multiArray){
$uniqueArray = array();
foreach($multiArray as $subArray){
if(!in_array($subArray, $uniqueArray)){
$uniqueArray[] = $subArray;
}
}
return $uniqueArray;
}
$unique = array_multi_unique($result);
print_r($unique);
Как ни странно, in_array
работает для массивов, где array_unique
нет.