Frank Stabenau: Doppelte einträge im Array entfernen...

Huhu,

ich muss schon wieder nerven, sry aber ich komm echt nich weiter.

Angenommen ich habe ein Array in dem weitere Arrays sind mit 3 Stellen (artikel_nr, groesse, menge). Nun haette ich gern, wenn Arrays enthalten sind, wo artikel_nr und groesse gleich sind, eins davon entfernt haben.

Ich habe versucht das Hauptarray mit einer Copy vom selben in einer Schleife zu vergleichen, aber das haut einfach nich hin.

Bringt mich bitte auf den richtigen Weg.

Gruß Frank

  1. $merk_stelle = array();

    for($i=0;$i<count($bestell_copy);$i++) {

    for($j=0;$j<count($bestell);$j++) {

    if($bestell_copy[$i][artikel_id] == $bestell[$j][artikel_id] &&
    $bestell_copy[$i][groesse] == $bestell[$j][groesse] &&
    $i != $j) {

    $merk_stelle[] = $j;

    }

    }

    }

    echo "Merk: ".implode(", ",$merk_stelle);

    Gibt mir immer beide Stellen aus... :-/

    1. Sup!

      Alle Einträge mit allen vergleichen hat eine Komplexität von ... ehm... O(Summe von k = 1 bis n von n-k) ... oder so, möglicherweise kommt das auf O(1/2 n^2) raus... wenn ich mich nicht irre... keine Lust zum Nachdenken gerade.

      Möglicherweise wäre also die beste Möglichkeit, den Array zu sortieren und dann Dubletten wegzuwerfen, weil Sortieren die Komplexität O(n log n) und das Wegwerfen dann Komplexität O(n) hat.

      Gruesse,

      Bio

      --
      Und er laechelt, denn er weiss: Das Boese siegt immer!
    2. Gibt mir immer beide Stellen aus... :-/

      wie meinst du das ^^^^^^^^^^^^^^^^^?
      das problem ist wohl, dass deine treffer immer zweimal gefunden werden: einmal, wenn die äussere schleife an dem 'richtigen' punkt ist und einmal, wenn die innere stelle an dem _gleichen_ punkt einen treffer findet. der fehler ist nur, dass du deine treffer gleich rauswerfen musst. also array_splice...

      andi

  2. hallo,
    ich kann dir leider nciht sagen, ob es sowas schon 'fertig' gibt. ich würde es so probieren (ungetestet).

    Angenommen ich habe ein Array in dem weitere Arrays sind mit 3 Stellen (artikel_nr, groesse, menge). Nun haette ich gern, wenn Arrays enthalten sind, wo artikel_nr und groesse gleich sind, eins davon entfernt haben.

    foreach($myArray as $outerKey => $outerValue){
      foreach($myArray as $innerKey => $innerValue){
        if($outerKey != $innerKey){ // nicht an der gleiche index-position
          if($outerValue['artikel_nr'] == $innerValue['artikel_nr'] &&
          $outerValue['groesse'] == $innerValue['groesse']){
            $myArray = array_splice($myArray, $innerKey, 1);
          }
        }
      }
    }

    andi

    1. Hallo.

      Das Einzige, was mir dazu noch einfällt ist, dass du den Array 2x überprüfst. Allerdings muss man, um das zu umgehen for-Schleifen nehmen:

      $anzahl = count($artikel);

      for ($i=0; $i<$anzahl; $i++)
      {
        for ($j=$i+1; $j<$anzahl; $j++)
        {
          if($artikel[$i]['artikel_nr'] == $artikel[$j]['artikel_nr'] &&
          $artikel[$i]['groesse'] == $artikel[$j]['groesse']) {
            $artikel = array_splice($artikel, $j, 1);
            $anzahl--;
            $j--;
          }
        }
      }

      Ich hab's aber auch nicht getestet.

      MfG _Siro.

      1. Hallo.

        Das Einzige, was mir dazu noch einfällt ist, dass du den Array 2x überprüfst.

        das glaube ich aber nicht. dadurch, dass beide schleifen auf dem gleichen array laufen und mit array_splice aus eben _diesem_ array was weggeenommen wird, kann beim nächsten durchlauf des weggenommene element nicht mehr angesprungen werden. oder?

        andi

        1. Ich meinte nicht die weggenommenen sondern die Elemente insgesamt.
          Da gibt es dieses schöne Beispiel mit den drei Leuten die sich die Hände geben. Wenn jeder jedem die Hand gibt, sind das 6(3+2+1) 'Händeschüttler'.
          Wenn man es aber mit zwei Schleifen vorschreiben würde, wer wem die Hand gibt, dann wären es 9(3+3+3), da sich alle zweimal treffen.

          Beispiel: 1 schüttelt 2 und
                    2 schüttelt 1 ist irgendwie das gleiche.

          Deshalb mach ich es so:
          Schleife 1: Anfang -> Ende
          Schleife 2: Position Schleife 1 + 1 -> Ende

          MfG _Siro.

  3. Das Problem war das ich zu testzwecken mir die Stellen nur hab ausgeben lassen. Ich hätte das Element wirklich sofort löschen müssen. Nur funktionierte array_splice() und unset() irgendwie nicht so recht.

    Die einfachste Lösung für mich war das ganze zu umgehen. Ich hatte 2 Array zusammengefügt und so uU doppelte Einträge erhalten. Nun hab ich es einfach so gemacht, das ich vorm zusammenfügen der Arrays auf gleiche Elemente gebrüft habe und diese mit unset() entfernt habe.

    Danke nochmal an alle.

    Gruß Frank

    1. Hallo Frank,

      Du hast zwar dein Problem schon gelöst, mich würde aber interessieren, warumn Du das nicht mit array_unique() machst.

      array_unique($array) nimmt $array und gibt ein neues Array zurück, aus dem alle doppelten Einträge entfernt wurden.

      Und um dein Problem zu vervollständigen, ich hätte das in etwa so gemacht (Pseudocode):

      $array_neu = array_merge (array1, array2 [, array ...])

      $array_neu_bereinigt = array_unique($array_neu)

      Grüsse
      Frankie

      1. Hallo Frank,

        dito,

        Du hast zwar dein Problem schon gelöst, mich würde aber interessieren, warumn Du das nicht mit array_unique() machst.

        array_unique() habe ich getestet, aber es hat nicht funktioniert, vermutlich weil

        $array_neu = array_merge (array1, array2 [, array ...])

        zb array1 ein weiteres array enthält. Oder schaut array_unique() wirklich in jede ebene und vergleicht?

        Gruß Frank

        1. Hallo Frank,

          dito,

          dito,

          Du schriebst im OP:

          Angenommen ich habe ein Array (1) in dem weitere Arrays (2) sind mit 3 Stellen (artikel_nr, groesse, menge). Nun haette ich gern, wenn Arrays enthalten sind, wo artikel_nr und groesse gleich sind, eins davon entfernt haben.

          Ich habe das so interpretiert bzw. mein Lösungsvorschlag basierte auf der Annahme, daß die Arrays (2), also die Elemente von Array (1), keine weiteren Arrays enthalten. array_merge() war auf eben diese Arrays (2) bezogen, unter der Annahme, daß das Ergebnis dann ein eindimensionales Array ergibt, welches sich dann mit array_unique() bereinigen lässt.

          Gruß Frank

          dito ;-)