So entfernen Sie doppelte Werte aus einem Array in PHP


Antworten:


250

Verwenden Sie array_unique () .

Beispiel:

$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
Die oben genannten Elemente behalten die Schlüssel der Elemente bei. Wenn Sie möchten, dass sie neu indiziert werden, wenden Sie zusätzlich array_values ​​an: php.net/manual/en/function.array-values.php
CodeVirtuoso

3
Dies hat bei mir nicht funktioniert. Bitte verwenden Sie: $array = array_unique($array, SORT_REGULAR);
iniravpatel

@ PeterAjtai: Vielen Dank für die Hervorhebung im Kommentarbereich. Das hat mir viel Zeit gespart.
Nana Partykar

29

Verwenden array_values(array_unique($array));

array_unique: für eindeutiges Array array_values: für die Neuindizierung


1
+1 array_uniquegibt ein Objekt mit Schlüssel- und Wertepaaren zurück UND gibt array_valuesnur Werte als Array zurück.
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

Das einzige, was für mich funktioniert hat, ist:

$array = array_unique($array, SORT_REGULAR);

Bearbeiten: SORT_REGULARBehält die gleiche Reihenfolge wie das ursprüngliche Array bei.


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

5

Manchmal array_unique()ist das nicht der richtige Weg, wenn Sie eindeutige UND duplizierte Artikel erhalten möchten ...

$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

Ergebnisse auf

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

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

3

Wir können einen solchen Array-Typ erstellen, um diesen letzten Wert zu verwenden. Er wird in einen Spalten- oder Schlüsselwert aktualisiert und erhält einen eindeutigen Wert aus dem Array ...

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

Dies kümmert sich um Schlüsselzuordnungen und serialisiert die Schlüssel für das resultierende neue Array :-)


1
Was wäre die Wirkung sein , explode("," $YOUR_ARRAY)wenn $YOUR_ARRAYist array("1", "2", "3")?
Kiamlaluno

@kiamlaluno - :) und die Antwort ist: Warnung: explode () erwartet, dass Parameter 2 Zeichenfolge ist, Array in ... online gegeben ....
Jesse Chisholm

@ JesseChisholm Ja, das war der Punkt, aber anscheinend hat niemand den Code bemerkt.
Kiamlaluno

2

Abhängig von der Größe Ihres Arrays habe ich gefunden

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

kann schneller sein als array_unique.


Weitere Informationen darüber, was hier vor sich geht und ob es mit einem größeren oder kleineren Array schneller geht.
Fi Horan

Durch den doppelten Flip werden doppelte Werte entfernt, da ein Schlüssel nicht zweimal vorhanden sein kann, da er sonst überschrieben wird. Wenn ein Wert dupliziert und das Array umgedreht wird, ist das letzte Vorkommen (ich nehme an) der Wert für den Schlüssel.
Goldentoa11

In PHP 7 habe ich festgestellt, dass das mehrmalige Umdrehen eines mehrdimensionalen Arrays möglicherweise unerwartet Array-Elemente neu anordnet.
Josh Habdas

1

Das ist eine großartige Möglichkeit, dies zu tun. Vielleicht möchten Sie sicherstellen, dass die Ausgabe wieder ein Array ist. Jetzt zeigen Sie nur den letzten eindeutigen Wert an.

Versuche dies:

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

Überprüfen Sie den Wert zum ersten Mal im Array und finden Sie den gleichen Wert. Ignorieren Sie ihn


1

Entfernen Sie doppelte Werte aus einem assoziativen Array in 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]);
}

Array ([0] => aaa-aaa [1] => 12/1/1 [2] => 1,15)


1

Es gibt mehrere Möglichkeiten, dies zu tun:

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

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

1

Wenn Sie Bedenken hinsichtlich der Leistung haben und ein einfaches Array haben, verwenden Sie:

array_keys(array_flip($array));

Es ist um ein Vielfaches schneller als 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);

Der schnellste Weg, dies zu erreichen, ist die Verwendung der in PHP integrierten Funktion array_flip [1]. array_flip tauscht die Array-Werte mit ihren Schlüsseln aus. Da ein Array keine doppelten Schlüssel haben kann, erhalten Sie einen eindeutigen Satz von Schlüsseln, die den Werten des ursprünglichen Arrays entsprechen. Um diese Schlüssel als Werte abzurufen, können Sie die Funktion array_keys verwenden, um Ihre eindeutigen Werte abzurufen. Sowohl array_flip als auch array_keys sind Worst-Case-O (n) -Funktionen, während array_unique den Worst-Case von O (n log (n)) hat. [2]
Pawan Kumar

1
Bitte fügen Sie Ihrer Antwort eine weitere Erklärung hinzu (nicht dem Kommentarbereich!). Wie entfernt der angegebene Code doppelte Werte aus einem einzelnen Array? Warum brauchen Sie dafür zwei Arrays?
Nico Haase

Willkommen bei StackOverflow! Ich sehe, dass Sie in den Kommentaren Ihrer Antwort einige Erklärungen hinzugefügt haben. Es wäre hilfreich, wenn Sie diese Informationen als Teil Ihrer Antwort selbst hinzufügen.
n4m31ess_c0d3r

Es erscheint vernünftiger, diesen Kommentar als Bearbeitung zu einer bereits seit langem vorhandenen Antwort hinzuzufügen ( stackoverflow.com/a/52591730/2109067 ).
Ankhzet

Sie können ein einzelnes Array mit doppelten Elementen verwenden. Ich hatte das Problem, Werte von zwei Arrays in ein Array zu übertragen und dann Duplikate zu entfernen.
Pawan Kumar

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

1
Dies erklärt wirklich nichts und scheint nicht "schlauer" zu sein.
Sven

Sie können jederzeit erklären, warum, indem Sie Ihren eigenen Beitrag bearbeiten. Klicken Sie einfach am Ende Ihrer Antwort auf den Link "Bearbeiten". Ich schlage auch vor, dass Sie einen Blick auf die FAQ werfen
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

Probieren Sie diesen kurzen und süßen Code aus -

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

Ausgabe -

array(6) {
  [0]=>
  int(1)
  [1]=>
  int(4)
  [2]=>
  int(2)
  [3]=>
  int(7)
  [4]=>
  int(9)
  [5]=>
  int(5)
}

1
Der Missbrauch von Booleschen Operatoren für einen solchen Kontrollfluss ist unnötig verwirrend. Einfach benutzen if.
Mark Amery

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

Das Zählen ($ arr) in der Schleife ist ziemlich langsam
Kiruahxh

0

Hier habe ich ein zweites leeres Array erstellt und eine forSchleife mit dem ersten Array verwendet, das Duplikate enthält. Es wird so oft ausgeführt wie die Anzahl des ersten Arrays. Dann verglichen mit der Position des Arrays mit dem ersten Array und übereinstimmend, dass es dieses Element bereits hat oder nicht, indem es verwendet in_array. Wenn nicht, wird dieses Element dem zweiten Array mit hinzugefügt 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);

Können Sie uns eine Erklärung zu diesem Code geben? Warum verwenden Sie zum Beispiel keine foreachSchleife?
Nico Haase

Dies ist eine Art von Vorgehensweise und warum ich es nicht verwendet habe, foreachweil ich mich mit for-Schleifen sehr wohl fühle. Das ist es.
Aladin Banwal

Trotzdem sollten Sie dem Code einige Erklärungen geben. Das Posten solcher Antworten auf SO ist kein guter Stil: Menschen mit dem gleichen Problem wie das OP könnten mitkommen, und sie sollten verstehen können, wie Ihr Code das Problem löst, damit sie daraus lernen und es an ihre Bedürfnisse anpassen können
Nico Haase

0

Dies kann durch die Funktion erfolgen. Ich habe drei Funktionsduplikate erstellt, die die Werte zurückgeben, die im Array doppelt vorhanden sind.

Die zweite Funktion single gibt nur die Werte zurück, bei denen es sich um einzelne Werte handelt, die im Array nicht wiederholt werden, und die dritte und die vollständige Funktion geben alle Werte zurück, werden jedoch nicht dupliziert, wenn ein Wert dupliziert wird. Sie konvertieren ihn in 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;
}

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

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

ref: Demo


1
Was bringt es, diese Frage 11 Jahre nach der ursprünglichen Antwort mit array_unique zu beantworten, was genau das ist?
Dylan Kas

0

Eine Alternative für die Funktion array_unique ().

Verwenden des Brute-Force-Algorithmus

// [1] Dies ist unser Array mit doppelten Elementen

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

// [2] Container für das neue Array ohne doppelte Elemente

$ arr = [];

// [3] Ermittelt die Länge des duplizierten Arrays und setzt sie auf die Variable, die für die for-Schleife verwendet werden soll

$ len = count ($ Übereinstimmungen);

// [4] Wenn der Array-Schlüssel ($ i) übereinstimmt, ist die Iteration der aktuellen Schleife in nicht verfügbar // [4] das Array $ arr drückt dann den aktuellen Iterationsschlüsselwert der Übereinstimmungen [$ i] // [4] zum Array arr.

für ($ 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

Ich habe dies ohne Verwendung einer Funktion getan.

$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>";
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.