Я знаю, что есть функция 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; } }