Simon Riedl: Aus einem Array doppelte Werte entfernen

Hallo!

Gibt es bei PHP 3 die Möglichkeit, aus einem Array alle doppelten Werte zu entfernen? Beispielsweise soll aus einem Array (8,6,10,6,5,8) die doppelten Werte 8 und sechs herausgefiltert werden damit sowas entsteht (8,6,10,5).

Ich habe schon herumgebastelt und folgendes erstellt:

$a1=Array() //das Array mit den doppelten Werten
$a2=Array(); $a2_count=0;
for($i=0; $i<counter($a1); $i++){
 for($j=0,$k=0; $j<count($a1); $j++){
  if($a1[$i]==$a1[$j]) {$k++;}
 }// end for
 if ($k==1){$a2[$a2_counter]=$a1[$i]; $a2_counter++;}
}// end for
$a1=$a2;

Mein Problem ist jetzt allerdings, wenn bei hier ein Wert doppelt auftaucht, dann wird er ganz gestrichen (weil $k=2 ist). Es soll der Wert aber nur beim 2. Mal gestrichen werden.

Kann mir jemand weiterhelfen, wie ich dieses Problem lösen kann?

Simon

  1. Moin,

    Mein Problem ist jetzt allerdings, wenn bei hier ein Wert doppelt auftaucht, dann wird er ganz gestrichen (weil $k=2 ist). Es soll der Wert aber nur beim 2. Mal gestrichen werden.
    Kann mir jemand weiterhelfen, wie ich dieses Problem lösen kann?

    Dieses Problem schreit geradezu nach Verwendung
    von Hashtabellen. Probier mal folgendes (in Perl):

    #!/usr/bin/perl

    @A = (8,6,10,6,5,8);
    for(@A) {
      $X{$_}=1;
    }

    @B = keys %X;
    for(@B) {
      print $_."\n";
    }

    allerdings darf es Dir hierbei

    nicht auf die Reihenfolge der Elemente

    in @B ankommen

    mit PHP kenn ich mich nicht so aus, es sollte damit
    im Prinzip aber genauso gehen.

    Viele Grüße

    Andreas

  2. Hallo Simon!

    Gibt es bei PHP 3 die Möglichkeit, aus einem Array alle doppelten Werte zu entfernen? Beispielsweise soll aus einem Array (8,6,10,6,5,8) die doppelten Werte 8 und sechs herausgefiltert werden damit sowas entsteht (8,6,10,5).

    tja, in PHP 4 gäbe es da ja array_unique() ...

    In PHP sind alle Arrays Hashes, d.h. man kann beliebige Werte als Indices (=Schlüssel=$key) benutzen. Wieso also nicht die Feldwerte? Dadurch löschen sich die doppelten dann von alleine aus. (Der 'Hubert'ste-eintrag kann nur einmal existieren.)
    Dannach werden die Indices (das waren zu Anfang die Inhalte) wieder in ein neues Feld als Wert eintragen, und dabei werden die Einträge dann wieder neu durchnummeriert.
    Das funktioniert nur mit Strings und Zahlen (nicht mit Arrays und Objekten).

    $deinFeld=array( ..... ); // <--- zu verwurstendes Feld

    // hier werden die Werte($val) und Indices($key) vertauscht
    // in ein neues Feld eingtragen:
    $feld1=array();
    function Eintragen1($val, $key)
    {
      global $feld1;
      $feld1[$val]=$key;
    }
    array_walk($deinFeld,'Eintragen1');

    // das enstandende Feld in ein neues von 0... durchnummeriertes
    // Eintragen und aus den Indices wieder Inhalte machen
    $ErgebnisFeld=array();
    $index=0;
    function Eintragen2($val,$key)
    {
      global $ErgebnisFeld, $index;

    $ErgebnisFeld[$index++]=$key;
    }
    array_walk($feld1,'Eintragen2');

    ungetestet, also nicht schlagen wenn ich irgendwo ein $ vergessen habe.

    Gruss,
     Carsten

    1. du kannst es einfach mit in_array nach schauen:-)
      eine schleife durch das erste Array und klebe an das zweite Array if-not in_array :-)