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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
174
0
272 871
26
Перейти к ответу Данный вопрос помечен как решенный

Ответы 26

Ответ принят как подходящий

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

Пример:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)

@ Ян - Note that array_unique() is not intended to work on multi dimensional arrays.

Peter Ajtai 19.08.2010 23:45

Вышеупомянутое сохранит ключи элементов. Если вы хотите, чтобы они переиндексировались, дополнительно примените array_values: php.net/manual/en/function.array-values.php

CodeVirtuoso 11.01.2012 17:48

Это не сработало для меня, любезно используйте: $array = array_unique($array, SORT_REGULAR);

iniravpatel 12.01.2017 21:56

@PeterAjtai: Спасибо за выделение в разделе комментариев. Это сэкономило мне много времени.

Nana Partykar 12.12.2018 18:08

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

$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>";
}

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

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

Каким будет эффект explode("," $YOUR_ARRAY), если $YOUR_ARRAY будет array("1", "2", "3")?

kiamlaluno 18.08.2010 16:52

@kiamlaluno - :) и ответ: Предупреждение: explode () ожидает, что параметр 2 будет строкой, массив задан в ... в строке ....

Jesse Chisholm 13.07.2015 16:57

@JesseChisholm Да, дело было в этом, но, по-видимому, никто не заметил кода.

kiamlaluno 13.07.2015 19:30

иногда 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 */
$arrDuplicate = array ("","",1,3,"",5);
 foreach(array_unique($arrDuplicate) as $v){
  if ($v != "" ){$arrRemoved = $v;  }}
print_r($arrRemoved);

Это толком ничего не объясняет, да и "умнее" не кажется.

Sven 07.11.2012 03:24

Вы всегда можете объяснить, почему, редактируя собственное сообщение, просто нажмите ссылку «изменить» в конце ответа. Я также предлагаю вам заглянуть в FAQ: stackoverflow.com/faq

ForceMagic 07.11.2012 03:24
//Find duplicates 

$arr = array( 
    'unique', 
    'duplicate', 
    'distinct', 
    'justone', 
    'three3', 
    'duplicate', 
    'three3', 
    'three3', 
    'onlyone' 
);

$unique = array_unique($arr); 
$dupes = array_diff_key( $arr, $unique ); 
    // array( 5=>'duplicate', 6=>'three3' 7=>'three3' )

// count duplicates

array_count_values($dupes); // array( 'duplicate'=>1, 'three3'=>2 )

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

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

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

foreach (array_unique($arrDuplicate) as $v){
  if ($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);
function arrayUnique($myArray)
{
    $newArray = Array();
    if (is_array($myArray))
    {
        foreach($myArray as $key=>$val)
        {
            if (is_array($val))
            {
                $val2 = arrayUnique($val);
            }
            else
            {
                $val2 = $val;
                $newArray=array_unique($myArray);
                $newArray=deleteEmpty($newArray);
                break;
            }
            if (!empty($val2))
            {
                $newArray[$key] = $val2;
            }
        }
    }
    return ($newArray);
}

function deleteEmpty($myArray)
{
    $retArray= Array();
    foreach($myArray as $key=>$val)
    {
        if (($key<>"") && ($val<>""))
        {
            $retArray[$key] = $val;
        }
    }
    return $retArray;
}

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

$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)
}

Злоупотребление логическими операторами для потока управления напрасно сбивает с толку. Просто используйте if.

Mark Amery 27.08.2015 18:17

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

Вторая функция 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;
}

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

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

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

Дополнительная информация о том, что здесь происходит, и будет ли это быстрее с большим или меньшим массивом.

Fi Horan 31.08.2016 13:49

Двойной переворот удалит повторяющиеся значения, потому что ключ не может существовать дважды, иначе он будет перезаписан. Если какое-либо значение дублируется и массив переворачивается, последнее вхождение (я предполагаю) будет значением для ключа.

Goldentoa11 18.01.2017 16:42

В PHP 7 я заметил, что многократное переворачивание многомерного массива может неожиданно изменить порядок элементов массива.

Josh Habdas 31.05.2017 05:32

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

$array = array_unique($array, SORT_REGULAR);

Обновлено: SORT_REGULAR сохраняет тот же порядок исходного массива.

<?php
$arr1 = [1,1,2,3,4,5,6,3,1,3,5,3,20];    
print_r(arr_unique($arr1));


function arr_unique($arr) {
  sort($arr);
  $curr = $arr[0];
  $uni_arr[] = $arr[0];
  for($i=0; $i<count($arr);$i++){
      if ($curr != $arr[$i]) {
        $uni_arr[] = $arr[$i];
        $curr = $arr[$i];
      }
  }
  return $uni_arr;
}

Ввод count ($ arr) в цикл довольно медленно

Kiruahxh 02.05.2018 11:18

Используйте array_values(array_unique($array));

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

+1 array_unique возвращает объект с парами ключ и значение, а array_values возвращает только значения в виде массива.

narainsagar 21.09.2018 20:16
    if (@!in_array($classified->category,$arr)){        
                                    $arr[] = $classified->category;
                                 ?>

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

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

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

$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);

Удалите повторяющиеся значения из ассоциативного массива в 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] => aaa-aaa [1] => 12/1/1 [2] => 1,15)

$result = array();
foreach ($array as $key => $value){
  if (!in_array($value, $result))
    $result[$key]=$value;
}

Для этого может быть несколько способов, а именно:

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

//second method
$array = array_unique($arr, SORT_REGULAR);

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

array_keys(array_flip($array));

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

Здесь я создал второй пустой массив и использовал цикл 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);

Не могли бы вы рассказать об этом коде? Например, почему бы вам не использовать петлю foreach?

Nico Haase 04.12.2018 12:01

Это своего рода форма работы, и почему я не использовал foreach, потому что мне очень удобен цикл for. Вот и все.

Aladin Banwal 05.12.2018 05:26

Тем не менее, вы должны поделиться некоторыми пояснениями с кодом. Публикация таких ответов на SO - нехороший стиль: могут прийти люди с той же проблемой, что и OP, и они должны быть в состоянии понять, как ваш код решает проблему, чтобы они могли извлечь из него уроки и адаптировать его к своим потребностям.

Nico Haase 05.12.2018 09:37
$a = array(1, 2, 3, 4); 
$b = array(1, 6, 5, 2, 9); 
$c = array_merge($a, $b);
$unique = array_keys(array_flip($c));
print_r($unique);

Самый быстрый способ добиться этого - использовать функцию array_flip, встроенную в PHP [1]. array_flip заменит значения массива их ключами, и, поскольку массив не может иметь повторяющихся ключей, вы получите уникальный набор ключей, который соответствует значениям исходного массива. Чтобы получить эти ключи как значения, вы можете использовать функцию array_keys для получения ваших уникальных значений. И array_flip, и array_keys являются функциями O (n) для наихудшего случая, в то время как array_unique имеет наихудший случай O (n log (n)). [2]

pawan kumar 10.04.2019 15:39

Пожалуйста, добавьте дополнительные пояснения к своему ответу (не в раздел комментариев!). Как данный код удаляет повторяющиеся значения из массива не замужем? Зачем для этого нужны два массива?

Nico Haase 10.04.2019 16:05

Добро пожаловать в StackOverflow! Я вижу, что вы добавили некоторые пояснения в комментарии к своему ответу, было бы полезно, если бы вы добавили эту информацию как часть самого ответа.

n4m31ess_c0d3r 10.04.2019 16:08

Кажется более разумным добавить этот комментарий в качестве редактирования к уже давно существующему ответу (stackoverflow.com/a/52591730/2109067).

ankhzet 10.04.2019 16:38

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

pawan kumar 11.04.2019 18:21
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

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

ссылка: Демо

Какой смысл отвечать на этот вопрос с помощью array_unique через 11 лет после первоначального ответа, который является именно таким?

Dylan Kas 05.07.2019 16:24

Альтернатива функции array_unique () ..

Использование алгоритма грубой силы

//[1] This our array with duplicated items

$matches = ["jorge","melvin","chelsy","melvin","jorge","smith"];

//[2] Container for the new array without any duplicated items

$arr = [];

//[3] get the length of the duplicated array and set it to the var len to be use for for loop

$len = count($matches);

//[4] If matches array key($i) current loop Iteration is not available in //[4] the array $arr then push the current iteration key value of the matches[$i] //[4] to the array arr.

for($i=0;$i if (array_search($matches[$i], $arr) === false){ array_push($arr,$matches[$i]); } } //print the array $arr. print_r($arr); //Result: Array ( [0] => jorge [1] => melvin [2] => chelsy [3] => smith )

<?php
$a=array("1"=>"302","2"=>"302","3"=>"276","4"=>"301","5"=>"302");
print_r(array_values(array_unique($a)));
?>//`output -> Array ( [0] => 302 [1] => 276 [2] => 301 )`

Функция array_unique - лишь одна из действительно полезных встроенных функций PHP для работы с массивами. Недавно я написал статью о них и об операторе распространения для изменения массивов PHP и управления ими:

https://wp-helpers.com/2021/02/27/php-arrays-functions-and-spread-operator-in-wp-context/

На использование array_unique ответили 12 лет назад.

Kim Nyholm 27.02.2021 15:52

Другие вопросы по теме