So entfernen Sie doppelte Werte aus einem Array in PHP

155

Wie kann ich doppelte Werte aus einem Array in PHP entfernen?

Ian
quelle

Antworten:

250

Verwenden Sie array_unique () .

Beispiel:

$array = array(1, 2, 2, 3);
$array = array_unique($array); // Array is now (1, 2, 3)
Jeremy Ruten
quelle
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

Nimey Sara Thomas
quelle
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 )
chim
quelle
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.

iniravpatel
quelle
8
$result = array();
foreach ($array as $key => $value){
  if(!in_array($value, $result))
    $result[$key]=$value;
}
Amr Berag
quelle
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 */
AgelessEssence
quelle
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);
harte Kumar
quelle
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 :-)

Deb
quelle
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.

Bollis
quelle
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);
Trocknet B.
quelle
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

Alpesh Navadiya
quelle
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)

Shivivanand
quelle
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);
Shahrukh Anwar
quelle
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.

michal.jakubeczy
quelle
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);
Pawan Kumar
quelle
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);
user1045247
quelle
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;
}
Vineesh Kalarickal
quelle
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)
}
Rohit Suthar
quelle
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;
}
sumityadavbadli
quelle
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);
Aladin Banwal
quelle
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;
}
Mirza Obaid
quelle
0
$array = array("a" => "moon", "star", "b" => "moon", "star", "sky");

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

ref: Demo

Nageen Nayak
quelle
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 )

Richard Ramos
quelle
-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>";
}
Ashishdmc4
quelle