Php массивы удаление дубликатов

Удалить дубликаты в массиве

Дубликаты в массиве удаляются через функцию array_unique() .

$array = array('PHP','MySQL','PHP','Zend'); $array = array_unique($array); /* Array([0] => PHP [1] => MySQL [3] => Zend) */ 

Стоит обратить внимание, что array_unique() удаляет только дубликаты в массиве, а индексы остаются прежними, как видно на примере выше. Сдвинуть индексы массива можно через функцию array_values() .

$array = array('PHP','MySQL','PHP','Zend'); $array = array_unique($array); // сдвинуть индексы $array = array_values($array); /* Array([0] => PHP [1] => MySQL [2] => Zend) */ 

Функция array_unique() регистрозависима. То есть для array_unique() элементы «php» и «PHP» это два разных элемента.

Авторизуйтесь, чтобы добавлять комментарии

Источник

array_unique

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

Обратите внимание, что ключи сохранятся. array_unique() сначала сортирует значения как строки, сохраняет первый встреченный ключ для каждого значения и игнорирует все последующие ключи. Это не означает, что первый ключ каждого значения неотсортированного array будет сохранён.

Замечание: Два элемента считаются одинаковыми в том и только в том случае, если (string) $elem1 === (string) $elem2. Другими словами: если у них одинаковое строковое представление, то будет использован первый элемент.

Список параметров

Можно использовать необязательный второй параметр sort_flags для изменения поведения сортировки с помощью следующих значений:

  • SORT_REGULAR — нормальное сравнение элементов (типы не меняются)
  • SORT_NUMERIC — элементы сравниваются как числа
  • SORT_STRING — элементы сравниваются как строки
  • SORT_LOCALE_STRING — сравнивает элементы как строки, с учетом текущей локали.

Возвращаемые значения

Возвращает отфильтрованный массив.

Список изменений

Версия Описание
5.2.10 Значение по умолчанию параметра sort_flags изменено обратно на SORT_STRING .
5.2.9 Добавлен необязательный параметр sort_flags , по умолчанию равный SORT_REGULAR . До версии 5.2.9, это функция сортировала массив с помощью SORT_STRING .

Примеры

Пример #1 Пример использования array_unique()

$input = array( «a» => «green» , «red» , «b» => «green» , «blue» , «red» );
$result = array_unique ( $input );
print_r ( $result );
?>

Результат выполнения данного примера:

Array ( [a] => green [0] => red [1] => blue )

Пример #2 array_unique() и типы:

$input = array( 4 , «4» , «3» , 4 , 3 , «3» );
$result = array_unique ( $input );
var_dump ( $result );
?>

Результат выполнения данного примера:

Источник

array_unique

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

Обратите внимание, что ключи сохранены. Если несколько элементов сравниваются как равные под заданными flags , то ключ и значение первого равного элемента будут сохранены.

Примечание : два элемента считаются равными тогда и только тогда, когда (string) $elem1 === (string) $elem2 т.е. когда строковое представление одинаково, будет использоваться первый элемент.

Parameters

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

Флаги сортировочного типа:

  • SORT_REGULAR — сравнивать элементы в обычном режиме (не менять типы)
  • SORT_NUMERIC — сравнить элементы численно
  • SORT_STRING — сравнивать элементы как строки
  • SORT_LOCALE_STRING — сравнивать элементы как строки на основе текущего языкового стандарта.

Return Values

Возвращает отфильтрованный массив.

Changelog

Version Description
7.2.0 Если flags — SORT_STRING , ранее array был скопирован, а неуникальные элементы были удалены (без последующей упаковки массива), но теперь новый массив создается путем добавления уникальных элементов. Это может привести к разным числовым индексам.

Examples

Пример # 1 array_unique () Пример

 $input = array("a" => "green", "red", "b" => "green", "blue", "red"); $result = array_unique($input); print_r($result); ?>

Выводится приведенный выше пример:

Array ( [a] => green [0] => red [1] => blue )

Пример # 2 array_unique () и типы

 $input = array(4, "4", "3", 4, 3, "3"); $result = array_unique($input); var_dump($result); ?>

Выводится приведенный выше пример:

array(2) < [0] => int(4) [2] => string(1) "3" >

Notes

Примечание : обратите внимание, что array_unique () не предназначен для работы с многомерными массивами.

See Also

PHP 8.2

(PHP 5,7,8)array_uintersect_assoc Вычисляет пересечение массивов с дополнительной проверкой индекса,сравнивает данные функцией обратного вызова Обратите внимание,что

(PHP 5,7,8)array_uintersect_uassoc Вычисляет пересечение массивов с дополнительной проверкой индексов,сравнивает данные и индексы с помощью отдельных функций обратного вызова

(PHP 4,5,7,8)array_unshift Добавление одного или нескольких элементов в начало массива array_unshift()добавляет переданные элементы в начало Примечание:Сброс.

(PHP 4,5,7,8)array_values Возвращает все значения массива array_values()возвращает все значения from и индексы в числовом виде.

Источник

Php массивы удаление дубликатов

Массивы: удаление дубликатов по нескольким полям

Массивы: удаление дубликатов по нескольким полям

В текущем проекте проекте столкнулся с интересной задачей — требовалось сделать ассоциативный массив уникальным по нескольким полям. Стандартная функция array_unique в данном случае не поможет, посмотрим на одно из возможных решений.

Допустим, есть исходный массив:

$data = [ ['id' => 1, 'title' => 'AAA', 'section' => 1, 'tags' => 'a, b'], ['id' => 2, 'title' => 'AAA', 'section' => 2, 'tags' => 'a, c'], ['id' => 3, 'title' => 'AAA', 'section' => 1, 'tags' => 'a, d'], ['id' => 4, 'title' => 'AAA', 'section' => 1, 'tags' => 'a, b'], ];

Задача: получить уникальный массив по комбинации полей title и section , при этом значения остальных полей не важны. Т.е. результатом должен быть:

[ ['id' => 1, 'title' => 'AAA', 'section' => 1, 'tags' => 'a, b'], ['id' => 2, 'title' => 'AAA', 'section' => 2, 'tags' => 'a, c'], ]; // или [ ['id' => 2, 'title' => 'AAA', 'section' => 2, 'tags' => 'a, c'], ['id' => 4, 'title' => 'AAA', 'section' => 1, 'tags' => 'a, b'], ]; // и т.д.

В конечном итоге пришёл к довольно простому решению: делаем новый массив, в котором ключом каждого массива-элемента будет строка составленная из значений необходимых полей:

а значением — сам элемент-массив. Таким образом, массивы, в которых значения указанных полей дублируются, будут попросту перезаписывать друг друга. Затем же, чтобы избавиться от составных ключей, воспользуемся функцией array_values :

$filtered = []; foreach ($data as $item) < $filtered[$item['title'].$item['section']] = $item; >$result = array_values($filtered);

Вуаля! Требуемый результат получен — и никаких вложенных циклов, сложность алгоритма линейная (2N). Но давайте пойдём дальше и перепишем код с использованием встроенных функций. array_map также не подойдёт, поскольку не работает с ключами, но зато есть array_reduce . Хотя в документации и написано «. итеративно уменьшает массив к единственному значению, используя callback-функцию» — это не совсем так и эксперимент показал, что её можно использовать так же как и array.reduce() в javascript:

$filtered = array_reduce($data, function ($filtered, $item) < $filtered[$item['title'].$item['section']] = $item; return $filtered; >); $result = array_values($filtered);

И всё таки есть момент, который смущает — у нас хардкодом прописаны поля title и section , что само по себе не кошерно и исключает возможность повторного использования. Что, если нам понадобится исключать дубликаты по другим полям, скажем section и tags ? Или нужно будет работать с другим массивом? Решение не должно зависеть ни от какого-то конкретного массива, ни от каких-то конкретных полей и их количества. Правда, при таком раскладе вложенного цикла не избежать. С другой стороны, получим решение «на все случаи жизни»:

function uniqueByFields(array $source, array $fields) < $filtered = array_reduce($source, function ($filtered, $item) use ($fields) < $key = array_reduce($fields, function ($key, $field) use ($item) < return $key . $item[$field]; >); $filtered[$key] = $item; return $filtered; >); return $filtered; >

Единственное, что изменилось — мы составляем ключ по переданным полям (тот самый вложенный цикл). Пример использования:

$result = uniqueByFields($data, ['title', 'section']);

Естественно, никто не мешает функцию превратить в метод какого-то класса-хелпера.

Источник

Читайте также:  Настроить свое время php
Оцените статью