Array

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Array

    Hallo,

    ich versuche doppelte Einträge in drei verschiedene Array's
    löschen.

    Alle Array sind gleich zugeordnet:
    Nach Datum ist Name und Schicht,wenn Datum und Name sind gleich, kann vorkommen Schicht !=.z.B. Ein Herr Mustermann kann am 29.11.2001 Frühschicht und noch dazu
    am gleiche Tag Rufbereitschaft oder Spätschicht haben.

    for($i=1,$a=0;$i<count($akt_data),$a<count($akt_name)-1;$a++,$i++)
    {
    if($akt_data[$a]==$akt_data[$i] and $akt_name[$a]==$akt_name[$i] and $akt_schicht[$a]!=$akt_schicht[$i]) // line 48
    {
    $akt_schicht[$a]=$akt_schicht[$a].$akt_schicht[$i];
    array_splice($akt_data,$i,1);
    array_splice($akt_name,$i,1);
    array_splice($akt_schicht,$i,1);
    }
    }

    Kennt jemand die Möglichkeit das ohne diese Fehlermeldungen:

    Warning: Undefined offset: 25 in d:\**\**\**\**\jahr.php on line 48

    Warning: Undefined offset: 25 in d:\**\**\**\**\jahr.php on line 48

    Warning: Undefined offset: 26 in d:\**\**\**\**\jahr.php on line 48

    Warning: Undefined offset: 25 in d:\**\**\**\**\jahr.php on line 48

    und ohne error_reporting(0); zu machen.

    Danke.

    Gruß

    Edit: Logik war falsch!- neu version

    for($a=0;$a<count($akt_name)-1;$a++)
    {
    for($i=1;$i<count($akt_data);$i++)
    {
    if(($akt_data[$a]==$akt_data[$i] and $akt_name[$a]==$akt_name[$i]) and $akt_schicht[$a]!=$akt_schicht[$i])
    {
    $akt_schicht[$a]=$akt_schicht[$a].$akt_schicht[$i];
    array_splice($akt_data,$i,1);
    array_splice($akt_name,$i,1);
    array_splice($akt_schicht,$i,1);
    }
    }
    }

    Gruß


    [Editiert von ediel am 14-09-2001 um 11:02]

  • #2
    Das Problem:
    So genau blick ich auch nicht durch warum er nu $i=25 benutzt, obwohl count($akt_data)=25, aber es muß wohl irgendwie am array_splice() liegen.

    Die Lösung (hoffentlich):
    Zähl a und i von oben runter (und hör in der inneren Schleife auf, bevor du zwei identische Einträge mit einander vergleichst und i<a wird!!!):

    for($a=count($akt_name)-2;$a>=0;$a--)
    {
    for($i=count($akt_name)-1;$i>$a;$i--)
    {
    ...

    Noch ne Frage:
    Warum fragst du einmal $akt_name und einmal $akt_data ab? hat das einen besonderen Grund?
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      Hallo,

      eigentlich nicht, ohne besondere Grund.
      Danke für dein Vorschlag, ich werde bestimmt noch heute testen. Titus kann du mir vieleicht noch saubere Lösung, oder wie kann ich das machen ?

      Beim Vergleich zwei Zahlen oder String's ( z.B. im Array auf Platz 1 und irgendwo in der Mitte).Wenn die gleich sind,
      will ich Zahl/String in d.Mitte löschen, und Array dann
      soll auf 1 kleiner sein, und folgende nach 1 nach oben- bewegen? So muß Array jetzt auf 1 kleiner und ohne leere
      Platzhalter sein.

      noch genaue:

      $array2=array("1","2","3","4","3","2");

      nach saubere Löschaktion soll $array2 so aussehen ("1","2","3","4") ohne ("3","2").

      nach unset($array2[$i]) oder array_splice($array2,$i,1); kriege ich immer : Warning: Undefined offset: ......

      das bedeutet das in d.Mitte Array's ist ein leere feld!

      Danke.

      Gruß

      Kommentar


      • #4
        Bei so einfachen Arrays benutz doch einfach die Funktion array_unique.

        Sind zwei Elemente unterschiedlich, obwohl sie für dich gleich sind, mußt du die Funktion selbst implementieren:
        Code:
        $anz = count($array2);
        for ($i=$anz-2; $i>=0; $i--)
          for ($k=$anz-1; $k>$i; $k--)
            if ($array2[$k]==$array2[$i])
            {
              for ($m=$k+1; $m<$anz; $m++)
                $array2[$m-1] = $array2[$m];
              unset $array[--$anz];
            }
        Erläuterung:
        i läuft vom vorletzten Element rückwärts bis zum ersten
        k läuft vom letzten Element rückwärts bis zum (i+1)ten
        Sind Element i und k gleich (an der Stelle deine Vergleichsfunktion einsetzen), werden alle Elemente von k+1 bis zum letzten einen Index nach vorn kopiert und anschließend das ehemals letzte Element gelöscht.

        Nochmal zum unset: Das letzte Element des Arrays hat den Index $anz-1. Durch --$anz wird die Anzahl verringert, bevor das Element gelöscht wird.
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar


        • #5
          Hallo,

          Danke, deine Version ist besser, als meine.
          Ich werde das bestimmt verwenden.

          Gruß

          Kommentar

          Lädt...
          X