Как я могу удалить повторяющиеся значения из многомерного массива в PHP?
Пример массива:
Array
(
[0] => Array
(
[0] => abc
[1] => def
)
[1] => Array
(
[0] => ghi
[1] => jkl
)
[2] => Array
(
[0] => mno
[1] => pql
)
[3] => Array
(
[0] => abc
[1] => def
)
[4] => Array
(
[0] => ghi
[1] => jkl
)
[5] => Array
(
[0] => mno
[1] => pql
)
)
serialize(array('a' => '1', 'b' => '1'))
это отличается отserialize(array('b' => '1', 'a' => '1'))
. Эта опция потерпит неудачу для массивов, используемых какsets
или(hash)maps
.Начиная с 5.2.9, вы можете использовать,
array_unique()
если вы используетеSORT_REGULAR
флаг следующим образом:Это заставляет функцию сравнивать элементы на равенство, как если бы
$a == $b
они использовались, что идеально подходит для вашего случая.Вывод
Имейте в виду, что документация гласит:
источник
У меня была похожая проблема, но я нашел 100% работающее решение для нее.
источник
По-другому. Сохранит и ключи.
источник
У комментариев пользователей к документации array_unique () есть много решений для этого. Вот один из них:
Это из http://ca3.php.net/manual/en/function.array-unique.php#57202 .
источник
Если «удалить дубликаты» означает «удалить дубликаты, но оставить их там», решение может заключаться в том, чтобы
array_unique(...)
сначала применить к «столбцу идентификатора», а затем удалить в исходном массиве все ключи, которые были удалены из массива столбцов. :Результат:
источник
Это удалит дубликаты имен из массива. уникальный по ключу
источник
$array
ключи начинаются с «0». Возможно$array
, ключи начинаются с другого числа, если$array
это результат предшествующей манипуляции с массивом. Используйтеarray_values
для сброса ключей обратно на «0»Простое решение:
источник
Просто используйте параметр SORT_REGULAR в качестве второго параметра.
источник
если вам нужно устранить дубликаты на определенных ключах, таких как идентификатор mysqli, вот простая функция
Бонусные баллы Вы можете передать массив ключей и добавить внешний foreach, но он будет в 2 раза медленнее для каждого дополнительного ключа.
источник
Очень простой и логичный способ создания уникального многомерного массива заключается в следующем:
Если у вас есть такой массив:
используйте
foreach
для решения этого:это даст вам следующий результат:
и если вы хотите изменить порядок клавиш,
Эта операция даст вам упорядоченные значения ключей, как это:
Я надеюсь, что это все прояснит.
источник
если у вас есть такой массив:
(users - имя массива)
и вы хотите удалить дубликаты ... тогда:
может быть решение: P
источник
Легко читаемое решение, вероятно, не самое эффективное:
источник
Как говорят люди,
array_unique()
очень медленно, вот фрагмент, который я использую для одного уровня многомерного массива.Ссылка первого пользователя добавил примечание
array_unique()
функциональной страницы в php.netисточник
$output = array_map('unserialize', array_keys($result));
Многие люди спрашивали меня, как сделать уникальный многомерный массив. Я взял ссылку из вашего комментария, и это помогает мне.
Прежде всего, спасибо @jeromegamez @daveilers за ваше решение. Но каждый раз, когда я давал ответ, они спрашивали меня, как работает «сериализация» и «несериализация». Вот почему я хочу поделиться с вами причиной этого, чтобы помочь большему количеству людей понять концепцию, стоящую за этим.
Я объясняю, почему мы используем 'serialize' и 'unserialize' по шагам:
Шаг 1: Преобразовать многомерный массив в одномерный массив
Чтобы преобразовать многомерный массив в одномерный массив, сначала сгенерируйте представление потока байтов всех элементов (включая вложенные массивы) внутри массива. Функция serialize () может генерировать представление байтового потока значения. Чтобы сгенерировать представление байтового потока всех элементов, вызовите функцию serialize () внутри функции array_map () в качестве функции обратного вызова. Результатом будет одномерный массив независимо от того, сколько уровней имеет многомерный массив.
Шаг 2: Сделайте значения уникальными
Чтобы сделать этот одномерный массив уникальным, используйте функцию array_unique ().
Шаг 3: Верните его в многомерный массив
Хотя массив теперь уникален, значения выглядят как представление байтового потока. Чтобы вернуть его обратно в многомерный массив, используйте функцию unserialize ().
Еще раз спасибо за все это.
источник
Альтернатива сериализации и уникальность
* /
источник
Если у вас есть такой массив
и вы хотите получить такие массивы:
или
следующий код может помочь
источник
Я много думал об этой проблеме и решил, что оптимальное решение должно следовать двум правилам.
Имея это в виду и учитывая все особенности PHP, ниже приводится решение, которое я придумал. В отличие от некоторых других ответов, он имеет возможность удалять элементы в зависимости от того, какие ключи вы хотите. Ожидается, что входной массив будет цифровыми клавишами.
Единственным недостатком является то, что ключи не в порядке, когда итерация завершена. Это не проблема, если вы впоследствии используете только циклы foreach, но если вам нужно использовать цикл for, вы можете поставить
$input = array_values($input);
после вышеперечисленного, чтобы изменить нумерацию ключей.источник
На основании ответа помечен как правильный, добавив мой ответ. Небольшой код добавлен только для сброса индексов
источник