Как удалить повторяющиеся значения из массива в PHP

Как удалить повторяющиеся значения из массива в PHP?


person Ian    schedule 21.11.2008    source источник


Ответы (21)


Используйте array_unique().

Пример:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)
person Paige Ruten    schedule 21.11.2008
comment
@ Ян - Note that array_unique() is not intended to work on multi dimensional arrays. - person Peter Ajtai; 19.08.2010
comment
Вышеприведенное сохранит ключи элементов. Если вы хотите, чтобы они были переиндексированы, дополнительно примените array_values: php.net /manual/en/function.array-values.php - person CodeVirtuoso; 11.01.2012
comment
У меня это не сработало, пожалуйста, используйте: $array = array_unique($array, SORT_REGULAR); - person iniravpatel; 12.01.2017
comment
@PeterAjtai: Спасибо, что отметили это в разделе комментариев. Это сэкономило мне много времени. - person Nana Partykar; 12.12.2018

Используйте 1_

array_unique: для уникального массива array_values: для переиндексации

person nimey sara thomas    schedule 15.02.2017
comment
+1 array_unique возвращает объект с парами ключ-значение И array_values возвращает только значения в виде массива. - person narainsagar; 21.09.2018

Единственное, что сработало для меня, это:

$array = array_unique($array, SORT_REGULAR);

Изменить: SORT_REGULAR сохраняет тот же порядок исходного массива.

person iniravpatel    schedule 12.01.2017

иногда array_unique() не подходит, если вы хотите получить уникальные И повторяющиеся элементы...

$unique=array("","A1","","A2","","A1","");
$duplicated=array();

foreach($unique as $k=>$v) {

if( ($kt=array_search($v,$unique))!==false and $k!=$kt )
 { unset($unique[$kt]);  $duplicated[]=$v; }

}

sort($unique); // optional
sort($duplicated); // optional

результаты на

array ( 0 => '', 1 => 'A1', 2 => 'A2', ) /* $unique */

array ( 0 => '', 1 => '', 2 => '', 3 => 'A1', ) /* $duplicated */
person AgelessEssence    schedule 13.05.2011

Мы можем создать такой тип массива, чтобы использовать это последнее значение, которое будет обновлено до значения столбца или ключа, и мы получим уникальное значение из массива...

$array = array (1,3,4,2,1,7,4,9,7,5,9);
    $data=array();
    foreach($array as $value ){

        $data[$value]= $value;

    }

    array_keys($data);
    OR
    array_values($data);
person harsh kumar    schedule 29.06.2017

explode(",", implode(",", array_unique(explode(",", $YOUR_ARRAY))));

Это позаботится о сопоставлении ключей и сериализует ключи для полученного нового массива :-)

person Deb    schedule 18.08.2010
comment
Каков будет эффект explode("," $YOUR_ARRAY), когда $YOUR_ARRAY будет array("1", "2", "3")? - person apaderno; 18.08.2010
comment
@kiamlaluno - :) и ответ таков: Предупреждение: взрыв () ожидает, что параметр 2 будет строкой, массивом, заданным в ... в строке .... - person Jesse Chisholm; 13.07.2015
comment
@JesseChisholm Да, в этом и был смысл, но, видимо, никто не заметил код. - person apaderno; 13.07.2015

В зависимости от размера вашего массива я нашел

$array = array_values( array_flip( array_flip( $array ) ) );

может быть быстрее, чем array_unique.

person Bollis    schedule 25.07.2016
comment
Любая дополнительная информация о том, что здесь происходит, и будет ли это быстрее с большим или меньшим массивом. - person Fi Horan; 31.08.2016
comment
Двойной флип удалит повторяющиеся значения, потому что ключ не может существовать дважды, иначе он будет перезаписан. Если какое-либо значение дублируется и массив переворачивается, последнее вхождение (я предполагаю) будет значением для ключа. - person Goldentoa11; 18.01.2017
comment
В PHP 7 я заметил, что многократное переворачивание многомерного массива может привести к неожиданному изменению порядка элементов массива. - person Josh Habdas; 31.05.2017

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

Попробуй это:

$arrDuplicate = array ("","",1,3,"",5);

foreach (array_unique($arrDuplicate) as $v){
  if($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);
person Dries B    schedule 09.08.2012

    if (@!in_array($classified->category,$arr)){        
                                    $arr[] = $classified->category;
                                 ?>

            <?php } endwhile; wp_reset_query(); ?>

первый раз проверьте значение в массиве и найдите такое же значение, игнорируйте его

person Alpesh Navadiya    schedule 15.06.2017

Удалите повторяющиеся значения из ассоциативного массива в PHP.

$arrDup = Array ('0' => 'aaa-aaa' , 'SKU' => 'aaa-aaa' , '1' => '12/1/1' , 'date' => '12/1/1' , '2' => '1.15' , 'cost' => '1.15' );

foreach($arrDup as $k =>  $v){
  if(!( isset ($hold[$v])))
      $hold[$v]=1;
  else
      unset($arrDup[$k]);
}

Массив ( [0] => ааа-ааа [1] => 12/1/1 [2] => 1,15)

person Shivivanand    schedule 12.02.2018

Это может быть несколько способов сделать это, а именно:

//first method
$filter = array_map("unserialize", array_unique(array_map("serialize", $arr)));

//second method
$array = array_unique($arr, SORT_REGULAR);
person Shahrukh Anwar    schedule 05.06.2018

Если вы заботитесь о производительности и имеете простой массив, используйте:

array_keys(array_flip($array));

Это во много раз быстрее, чем array_unique.

person michal.jakubeczy    schedule 01.10.2018

попробуйте этот короткий и приятный код -

$array = array (1,4,2,1,7,4,9,7,5,9);
$unique = array();

foreach($array as $v){
  isset($k[$v]) || ($k[$v]=1) && $unique[] = $v;
  }

var_dump($unique);

Вывод —

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(4)
  [2]=>
  int(2)
  [3]=>
  int(7)
  [4]=>
  int(9)
  [5]=>
  int(5)
}
person Rohit Suthar    schedule 01.04.2014
comment
Злоупотребление логическими операторами для потока управления, как это, излишне сбивает с толку. Просто используйте if. - person Mark Amery; 27.08.2015
comment
вы не получаете ключ, но проверяете значение ключа - person fahdshaykh; 03.07.2021

Здесь я создал второй пустой массив и использовал цикл for с первым массивом, который имеет дубликаты. Он будет работать столько раз, сколько будет считать первый массив. Затем сравнивается с позицией массива с первым массивом и сопоставляется, есть ли в нем этот элемент уже или нет, с помощью in_array. Если нет, то он добавит этот элемент во второй массив с помощью array_push.

$a = array(1,2,3,1,3,4,5);
$count = count($a);
$b = [];
for($i=0; $i<$count; $i++){
    if(!in_array($a[$i], $b)){
        array_push($b, $a[$i]);
    }
}
print_r ($b);
person Aladin Banwal    schedule 04.12.2018
comment
Можете ли вы поделиться некоторыми пояснениями об этом коде? Например, почему бы вам не использовать цикл foreach? - person Nico Haase; 04.12.2018
comment
Это своего рода форма выполнения, и почему я не использовал foreach, потому что мне очень удобно использовать цикл for. Вот и все. - person Aladin Banwal; 05.12.2018
comment
Тем не менее, вы должны поделиться некоторыми пояснениями с кодом. Публикация таких ответов на SO не является хорошим стилем: могут прийти люди с той же проблемой, что и у OP, и они должны быть в состоянии понять, как ваш код решает проблему, чтобы они могли учиться на нем и адаптировать его к своим потребностям. - person Nico Haase; 05.12.2018

Это можно сделать с помощью функции, которую я сделал, три дубликата функций возвращают значения, которые дублируются в массиве.

Вторая функция single возвращает только те значения, которые являются одиночными, что означает, что они не повторяются в массиве, а третья и полная функция возвращает все значения, но не дублируются, если какое-либо значение дублируется, оно преобразует его в одиночное;

function duplicate($arr) {
    $duplicate;
    $count = array_count_values($arr);
    foreach($arr as $key => $value) {
        if ($count[$value] > 1) {
            $duplicate[$value] = $value;
        }
    }
    return $duplicate;
}
function single($arr) {
    $single;
    $count = array_count_values($arr);
    foreach($arr as $key => $value) {
        if ($count[$value] == 1) {
            $single[$value] = $value;
        }
    }
    return $single;
}
function full($arr, $arry) {
    $full = $arr + $arry;
    sort($full);
    return $full;
}
person Mirza Obaid    schedule 27.07.2015

Мы можем легко использовать arrar_unique($array); для удаления повторяющихся элементов Но проблема в этом методе заключается в том, что индексы элементов не в порядке, что вызовет проблемы, если они будут использованы где-то еще позже.

Использовать

$arr = array_unique($arr);
$arr = array_values($arr);
print_r($arr);

Или

$arr = array_flip($arr);
$arr = array_flip($arr);
$arr = array_values($arr);
print_r($arr);

Первый флип переворачивает пару значений ключа, таким образом, объединяя элементы с похожим ключом (изначально это было значение).

2-й флип, чтобы вернуть все пары ключ-значение. Наконец, array_value() устанавливает каждое значение с ключом, начинающимся с 0.

Примечание. Не использовать в ассоциативном массиве с предопределенными парами "ключ-значение"

person Rishi Chowdhury    schedule 07.07.2021

Я сделал это без использования какой-либо функции.

$arr = array("1", "2", "3", "4", "5", "4", "2", "1");

$len = count($arr);
for ($i = 0; $i < $len; $i++) {
  $temp = $arr[$i];
  $j = $i;
  for ($k = 0; $k < $len; $k++) {
    if ($k != $j) {
      if ($temp == $arr[$k]) {
        echo $temp."<br>";
        $arr[$k]=" ";
      }
    }
  }
}

for ($i = 0; $i < $len; $i++) {
  echo $arr[$i] . " <br><br>";
}
person Ashishdmc4    schedule 07.03.2010

$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

// Deleting the duplicate items
$result = array_unique($array);
print_r($result);

ссылка: Демо

person nageen nayak    schedule 05.07.2019
comment
Какой смысл отвечать на этот вопрос с помощью array_unique через 11 лет после первоначального ответа, который был именно таким? - person Dylan Kas; 05.07.2019

person    schedule
comment
Самый быстрый способ добиться этого — использовать функцию array_flip, встроенную в PHP[1]. array_flip поменяет местами значения массива с их ключами, и, поскольку массив не может иметь повторяющихся ключей, вы получите уникальный набор ключей, соответствующих значениям исходного массива. Чтобы получить эти ключи как значения, вы можете использовать функцию array_keys для получения ваших уникальных значений. И array_flip, и array_keys являются функциями O(n) в наихудшем случае, в то время как array_unique имеет наихудший случай O(n log(n)).[2] - person pawan kumar; 10.04.2019
comment
Пожалуйста, добавьте дополнительные пояснения к вашему ответу (не в раздел комментариев!). Как данный код удаляет повторяющиеся значения из одного массива? Зачем вам два массива для этого? - person Nico Haase; 10.04.2019
comment
Добро пожаловать в StackOverflow! Я вижу, что вы добавили некоторые пояснения в комментарии к своему ответу, было бы полезно, если бы вы добавили эту информацию как часть самого вашего ответа. - person n4m31ess_c0d3r; 10.04.2019
comment
Кажется более разумным добавить этот комментарий в качестве редактирования уже давно существующего ответа (stackoverflow.com/a/52591730/2109067 ). - person ankhzet; 10.04.2019
comment
Вы можете использовать один массив с повторяющимися элементами. У меня возникла проблема с получением значений из двух массивов в один, а затем удалением дубликатов. - person pawan kumar; 11.04.2019

person    schedule
comment
Это действительно ничего не объясняет и не кажется умнее. - person Sven; 07.11.2012
comment
Вы всегда можете объяснить, почему, отредактировав свой собственный пост, просто нажмите на ссылку редактирования в конце своего ответа. Я также предлагаю вам ознакомиться с часто задаваемыми вопросами: stackoverflow.com/faq - person ForceMagic; 07.11.2012

person    schedule
comment
Ввод count($arr) в цикл довольно медленный - person Kiruahxh; 02.05.2018