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


Відповіді:


251

Використовуйте array_unique () .

Приклад:

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

20
@Ian -Note that array_unique() is not intended to work on multi dimensional arrays.
Peter Ajtai

18
Вищезгадане збереже клавіші елементів. Якщо ви хочете, щоб їх переіндексували, додатково застосуйте array_values: php.net/manual/en/function.array-values.php
CodeVirtuoso

3
Це не працювало для мене люб’язно: $array = array_unique($array, SORT_REGULAR);
iniravpatel

@PeterAjtai: Дякую за те, що ви виділили у розділі коментарів. Це зекономило багато часу для мене.
Nana Partykar

29

Використовуйте array_values(array_unique($array));

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


1
+1 array_uniqueповертає об'єкт парами ключів і значень І array_valuesповертає лише значення у вигляді масиву.
narainsagar

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 )

9

Єдине, що працювало для мене, це:

$array = array_unique($array, SORT_REGULAR);

Редагувати: SORT_REGULARзберігає той самий порядок вихідного масиву.



5

іноді 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 */

3

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

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

2

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

Це подбає про асоціації ключів і серіалізує ключі для нового масиву :-)


1
Який був би ефект, explode("," $YOUR_ARRAY)коли $YOUR_ARRAYє array("1", "2", "3")?
кіямлалуно

@kiamlaluno - :), а відповідь така: Попередження: explode () очікує, що параметр 2 буде рядком, масив заданий ... у рядку ....
Джессі Чисхолм

@JesseChisholm Так, справа була в цьому, але код, очевидно, ніхто не помітив.
kiamlaluno

2

Залежно від розміру вашого масиву, я знайшов

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

може бути швидше, ніж array_unique.


Будь-яка інформація про те, що відбувається тут, і чи швидше це буде з більшим або меншим масивом.
Fi Horan

Подвійний фліп буде видаляти повторювані значення, оскільки ключ не може існувати двічі, інакше він буде перезаписаний. Якщо будь-яке значення дублюється і масив перевернуто, останнім явищем (я припускаю) буде значення для ключа.
Goldentoa11

У PHP 7 я помітив, що перегортання багатовимірного масиву більше одного разу може несподівано змінити елементи масиву.
Джош Хабдас

1

Це чудовий спосіб зробити це. Можливо, хочете переконатися, що його результат знову є масивом. Тепер ви показуєте лише останнє унікальне значення.

Спробуйте це:

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

foreach (array_unique($arrDuplicate) as $v){
  if($v != "") { $arrRemoved[] = $v; }
}
print_r ($arrRemoved);

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

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

перший раз перевірити значення в масиві і виявив те саме значення, що ігнорує його


1

Видаліть повторювані значення з асоціативного масиву в 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)


1

Існує кілька способів зробити це, а саме:

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

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

1

Якщо ви турбуєтеся про продуктивність і маєте простий масив, використовуйте:

array_keys(array_flip($array));

Це в багато разів швидше array_unique.


1
$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

1
Будь ласка, додайте до своєї відповіді ще трохи пояснень (не до розділу коментарів!). Як даний код видаляє повторювані значення з одного масиву? Навіщо для цього потрібні два масиви?
Ніко Хааз

Ласкаво просимо до StackOverflow! Я бачу, що ви додали пояснення у коментарях вашої відповіді, було б корисно, якщо ви додасте цю інформацію як частину своєї відповіді.
n4m31ess_c0d3r

Доцільніше додати цей коментар як редагування до вже давно існуючої відповіді ( stackoverflow.com/a/52591730/2109067 ).
ankhzet

Можна використовувати єдиний масив з повторюваними елементами. У мене виникла проблема з отриманням значень з двох масивів в один, а потім видалення дублікатів.
pawan kumar

0
$arrDuplicate = array ("","",1,3,"",5);
 foreach(array_unique($arrDuplicate) as $v){
  if($v != "" ){$arrRemoved = $v;  }}
print_r($arrRemoved);

1
Це насправді нічого не пояснює, і воно не здається «розумнішим».
Свен

Ви завжди можете пояснити, чому, редагуючи власну публікацію, просто натисніть на посилання "редагувати" в кінці вашої відповіді. Я також вважаю , що ви подивіться на FAQ: stackoverflow.com/faq
ForceMagic

0
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;
}

0

спробуйте цей короткий і солодкий код -

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

1
Зловживання булевими операторами для керування потоком, подібне цьому, непотрібно заплутати. Просто використовуйте if.
Марк Амері

0
<?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;
}

Введення рахунку ($ arr) у циклі відбувається досить повільно
Kiruahxh

0

Тут я створив другий порожній масив і використав 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цикл?
Ніко Хааз

Це така собі форма ведення, і чому я цього не використовував, foreachоскільки мені дуже зручно робити цикл. Це воно.
Аладін Банвал

Тим не менш, вам слід поділитися деяким поясненням з кодом. Опублікувати такі відповіді на ТА не є гарним стилем: люди з тією ж проблемою, що і ОП, можуть зійти, і вони повинні мати можливість зрозуміти, як ваш код вирішує проблему, щоб вони могли навчитися з неї та прийняти її під свої потреби
Ніко Хаасе

0

Це можна зробити за допомогою функції Я зробив три функції дубліката повертає значення, які дублюються в масиві.

Друга функція одиночного повернення лише ті значення, які є єдиним середнім, не повторені в масиві, а третя і повна функція повертають усі значення, але не дублюються, якщо якесь значення дублюється, перетворюють його в єдине;

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

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

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

ref: Демо


1
Який сенс відповідати на це запитання array_unique через 11 років після оригінальної відповіді, що саме це?
Ділан Кас

0

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

Використання алгоритму сили Брута

// [1] Цей наш масив із дублюючими елементами

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

// [2] Контейнер для нового масиву без дублювання елементів

$ arr = [];

// [3] отримати довжину дублюючого масиву та встановити його на var len, який буде використовуватися для циклу

$ len = кол ($ матчів);

// [4] Якщо відповідність поточного циклу ітерації ключа масиву ($ i) недоступна в // [4] масив $ arr, потім натисніть поточне значення ітераційного ключа відповідності [$ i] // [4] до масиву масиву.

для ($ 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 )


-2

Я це зробив, не використовуючи жодної функції.

$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>";
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.