Как удалить все экземпляры дублированных значений из массива

Я знаю, что есть функция array_unique , но я хочу удалить дубликаты. Есть ли встроенная функция или мне нужно сворачивать самостоятельно.

Пример ввода:

 banna, banna, mango, mango, apple 

Ожидаемый результат:

 apple 

Вы можете использовать комбинацию array_unique , array_diff_assoc и array_diff :

 array_diff($arr, array_diff_assoc($arr, array_unique($arr))) 

Вы можете использовать

 $singleOccurences = array_keys( array_filter( array_count_values( array('banana', 'mango', 'banana', 'mango', 'apple' ) ), function($val) { return $val === 1; } ) ) 

Видеть

  • array_count_values – подсчитывает все значения массива
  • array_filter – Фильтрует элементы массива с помощью функции обратного вызова
  • array_keys – возвращает все ключи или подмножество ключей массива
  • обратные вызовы

Просто напишите свой простой цикл foreach:

 $used = array(); $array = array("banna","banna","mango","mango","apple"); foreach($array as $arrayKey => $arrayValue){ if(isset($used[$arrayValue])){ unset($array[$used[$arrayValue]]); unset($array[$arrayKey]); } $used[$arrayValue] = $arrayKey; } var_dump($array); // array(1) { [4]=> string(5) "apple" } с $used = array(); $array = array("banna","banna","mango","mango","apple"); foreach($array as $arrayKey => $arrayValue){ if(isset($used[$arrayValue])){ unset($array[$used[$arrayValue]]); unset($array[$arrayKey]); } $used[$arrayValue] = $arrayKey; } var_dump($array); // array(1) { [4]=> string(5) "apple" } с $used = array(); $array = array("banna","banna","mango","mango","apple"); foreach($array as $arrayKey => $arrayValue){ if(isset($used[$arrayValue])){ unset($array[$used[$arrayValue]]); unset($array[$arrayKey]); } $used[$arrayValue] = $arrayKey; } var_dump($array); // array(1) { [4]=> string(5) "apple" } 

повеселись 🙂

Если вы хотите оставить только значения в массиве, которые уже уникальны, вместо того, чтобы выбрать один уникальный экземпляр каждого значения, вам действительно придется сворачивать самостоятельно. Встроенная функциональность просто предназначена для дезинфекции наборов значений, а не для фильтрации.

Вы хотите удалить любые записи с дубликатами, чтобы у вас остались только записи, которые были уникальными в списке? Хм, это похоже на то, что вам нужно, чтобы катиться самостоятельно.

Нет существующей функции; Вам нужно сделать это за два прохода, один для подсчета уникальных значений и один для извлечения уникальных значений:

 $count = array(); foreach ($values as $value) { if (array_key_exists($value, $count)) ++$count[$value]; else $count[$value] = 1; } $unique = array(); foreach ($count as $value => $count) { if ($count == 1) $unique[] = $value; } 

Ответ сверху выглядит великолепно, но на стороне примечание: если вы когда-нибудь захотите удалить дубликаты, но оставьте первый, использование array_flip дважды было бы довольно простым способом сделать это. array_flip (array_flip (х))

Только частично относящийся к этому конкретному вопросу – но я создал эту функцию из ответа Gumbo для многомерных массивов:

 function get_default($array) { $default = array_column($array, 'default', 'id'); $array = array_diff($default, array_diff_assoc($default, array_unique($default))); return key($array); } 

В этом примере у меня были кешированные статусы, и каждый, кроме значения по умолчанию, был 0 (по умолчанию было 1). Я индексирую массив по default из идентификаторов, а затем превращаю его в строку. Таким образом, чтобы быть ясным – возвращаемый результат этого – это идентификатор состояния по умолчанию, обеспечивающий его в одной и той же части многомерного массива, а не его ключа

PHP.net http://php.net/manual/en/function.array-unique.php

array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )

Принимает входной массив и возвращает новый массив без повторяющихся значений.


Новое решение:

 function remove_dupes(array $array){ $ret_array = array(); foreach($array as $key => $val){ if(count(array_keys($val) > 1){ continue; } else { $ret_array[$key] = $val; } }