Ankündigung

Einklappen
Keine Ankündigung bisher.

Element aus mehrdimensionalem Array löschen

Einklappen

Neue Werbung 2019

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

  • Element aus mehrdimensionalem Array löschen

    Hallo !
    Das ist mein erster Beitrag überhaupt in einem Forum über PHP. Ich habe mich hier angemeldet, weil ich im Internet dieses Mal keine Lösung zu meinem Problem gefunden habe.

    Ich arbeite gerade an einem PN System (Ich weiß, ich hätte auch ein fertiges nehmen können, aber ich möchte auch verstehen, wie so etwas mal "from scratch" aus entwickelt wird.

    Nun zu meinem Problem:

    Wenn ich die Nachrichtenliste eines eingeloggten Users abrufe, bekomme ich folgendes array zurückgeliefert:

    Screenshot.png
    Nun möchte ich aber alle Elemente aus dem Array löschen, wo der Schlüssel "id" doppelt ist UND der Schlüssel "refmsg" NICHT gesetzt ist.
    Im obigen Beispiel soll also das Element "[0]" aus dem Array gelöscht werden. Leider habe ich keine passende Funktion bei PHP.net dazu gefunden und weiß gerade nicht, wo ich ansetzen muss.

    Ich verlange ja nicht direkt nach einer Lösung, aber ein Denkanstoß würde mir vllt auch helfen.

    Ach ja, mit "unset(array[0])" komme ich auch nicht weit, weil ja nicht immer das 0te Element das zu Löschende sein muss

    Grüße,
    Kighlander

  • #2
    Vorweg: Bitte keine Screenshots von Code posten sondern den Code selbst.

    Nun möchte ich aber alle Elemente aus dem Array löschen, wo der Schlüssel "id" doppelt ist UND der Schlüssel "refmsg" NICHT gesetzt ist.
    Im obigen Beispiel soll also das Element "[0]" aus dem Array gelöscht werden.
    ...
    ein Denkanstoß
    foreach(), if() und unset()
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Das klingt mir als ob das Problem eher schon im Schritt vorher liegt.
      Wo kommen diese Daten denn her? Vermutlich aus einer Datenbank?
      Dann kannst du direkt dort filtern, das ist einfacher und um Längen schneller als mit Php.

      Wenn du zwingend Php dafür benutzen willst geh dein Array per Schleife durch, prüfe ob refmsg enthalten ist (http://php.net/manual/de/function.array-key-exists.php) und wenn der nicht vorhanden ist kannst du per unset() das entsprechende Element löschen.

      Kommentar


      • #4
        Das ist richtig, die Daten kommen aus einer Datenbank.
        Jedes Element aus dem daraus resultierenden Array ist wiederum ein Array. Und aus dem Array will ich alle Elemente löschen, die den gleichen Schlüssel "id" haben, aber NICHT den Schlüssel "refmsg" besitzen.

        Das Feld "refmsg" kommt nicht aus der Datenbank, sondern ist ein Bezug auf eine andere Nachricht. Wenn ich aber nun jedes Element löschen würde, wo "refmsg" nicht vorhanden ist, würde ich auch andere Nachrichten löschen....

        *HaareRauf*

        Kommentar


        • #5
          Und wo kommt der Schlüssel refmsg her? Die Doppelungen kommen offensichtlich nicht aus der Datenbank, sonst würde dir der Teil mit "gleiche id" um die Ohren fliegen.
          Ganz davon abgesehen kannst du das jetzt auch immernoch im if() darstellen, zum Haare raufen sehe ich da nix. Sonst zeig uns mal etwas genauer deine Versuche und dein konkretes Problem.

          Kommentar


          • #6
            Gut, ich versuche es mal so detailliert wie möglich:
            1. Ich hole alle Nachrichten aus der DB, die an den eingeloggten User gerichtet sind ("to_id");
            2. Ich erstelle mir ein Hilfsarray, in dem später alle Nachrichten an mein "VIEW" übergeben werden. Das Array ist "$temp"
            3. Ich iteriere durch alle Nachrichten("$all_messages") und betrachte jede einzelne Nachricht("$message").
              Ist die Nachricht eine Erstnachricht ("home_msg" == NULL) gucke ich nach, ob es Nachrichten gibt, die auf diese Nachricht zeigen.
              Wenn mindestens eine Nachricht auf diese zeigt, dann bekommt das Array "$message" ein weiteres Feld hinzu ("$refmsg).
              Anschließend speichere ich diese Nachricht in meinem "$temp" Array ab.
              Ist es aber KEINE Erstnachricht, dann hole ich mir den Datensatz der Original-Nachricht und speichere den im "$temp" Array ab.
            4. Nun übergebe ich die Daten an meine "VIEW"
            Ich müsste also BEVOR die Daten an die "VIEW" gehen noch prüfen, ob im "$temp" Array mehrere Einträge vorhanden sind, die den selben Wert im Schlüssel "id" haben. Und NUR da, wo dann auch der Schlüssel "refmsg" existiert, der soll dann auch erhalten bleiben.

            Ich hoffe, das ist klar genug...

            Kommentar


            • #7
              Vermute die Dopplung ist eine fehlgeschlagene Ergänzung eines Eintrages mit einer refmsg. Die refmsg gehört wohl auch in die DB, kann ja mit NULL initialisiert werden.

              Edit zum Array-Problem:
              Das Array müsste im ersten Schritt so sortiert werden, das alle Einträge mit einer refmsg vorn stehen. Dann können mit array_filter alle Einträge für die schon eine id durchgelaufen ist und keine refmsg haben rausgefiltert werden.

              Aber nochmal: Vermute der Kern des Problems liegt ganz woanders, mit dem Array hier wird nur an den Symptomen herumgedocktert.

              Kommentar


              • #8
                Ich habe eine vielleicht nicht ganz saubere Lösung, aber nach drei FOREACH-Schleifen hatte ich ein brauchbares Ergebnis.
                Auch Tests haben das Ergebnis bestätigt.

                Wenn man sich das Bild aus meinem ersten Post in diesem Thread ansieht, ist das der Inhalt des Arrays "$temp". Darüber habe ich nun folgenden Code laufen lassen:
                PHP-Code:
                        $einzelneIDs = array();
                        
                $doppelteIDs = array();
                        foreach(
                $temp as $singletemp
                        {
                            if(!
                in_array($singletemp['id'], $einzelneIDs))
                            {
                                
                $einzelneIDs[] = $singletemp['id'];
                            } else {
                                
                $doppelteIDs[] = $singletemp['id'];
                            }
                        }
                        
                $key_ohne_refmsg = array();
                        foreach(
                $temp as $key => $singletemp)
                        {
                            foreach(
                $doppelteIDs as $id)
                            {
                                if(
                $singletemp['id'] == $id && !isset($singletemp['refmsg']))
                                {
                                    
                $key_ohne_refmsg[] = $key;
                                }
                            }
                        }

                        foreach(
                $key_ohne_refmsg as $delete)
                        {
                            unset(
                $temp[$delete]);
                        } 
                Ich hoffe, falls jemand Neues ebenfalls ein ähnliches Problem bekommt, er/sie damit einen Lösungsansatz findet.

                Freuen würde ich mich auch über eine elegantere Lösung, nur die fiel mir jetzt nicht ein.

                Grüße,
                Kighlander

                Kommentar

                Lädt...
                X