Ankündigung

Einklappen
Keine Ankündigung bisher.

JSON rekursive durchsuchen und entsprechendes Item löschen

Einklappen

Neue Werbung 2019

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

  • JSON rekursive durchsuchen und entsprechendes Item löschen

    Ich habe ein JSON-Objekt welches ich in einer php-Variable ablege bzw einlese:

    JSON:
    Code:
    [{
        "id": "581e1ec745e92",
        "title": "Terra1",
        "description": "Terra1",
        "sensoren": [{
            "id": "581e24c3aa26c",
            "title": "Sensor1",
            "nummer": "3",
            "temp": "",
            "humidity": "",
            "time": ""
        }],
        "geraete": [{
            "id": "581e24dc33412",
            "title": "Beispiel",
            "type": "Heizlampe",
            "device": "3",
            "number": "1",
            "status": false,
            "schaltung": [{
                "id": "581e24f72d300",
                "on": "11\/05\/2016 07:29:00 PM",
                "off": "dasdsad"
            }, {
                "id": "581e25069e04a",
                "on": "11\/05\/2016 07:29:18 PM",
                "off": "dasda"
            }]
        }]
    }, {
        "id": "581e1f9539d50",
        "title": "Terra2",
        "description": "Terra2",
        "sensoren": [{
            "id": "581e24cd41e48",
            "title": "Sensor2",
            "nummer": "2",
            "temp": "",
            "humidity": "",
            "time": ""
        }],
        "geraete": [{
            "id": "581e24ea4fa84",
            "title": "Geraet4",
            "type": "Heizlampe",
            "device": "1",
            "number": "3",
            "status": false,
            "schaltung": [{
                "id": "581e24fb9d817",
                "on": "11\/05\/2016 07:29:00 PM",
                "off": ""
            }]
        }]
    }]
    Und hier der Code mit dem ich das Objekt einlese:
    PHP-Code:
    function loadJSON()
        {
            
    $jsonfile file_get_contents('../json/terra.json');
            
    $GLOBALS['json'] = json_decode($jsonfiletrue); // decode the JSON into an associative array
        

    Nun gebe ich einer Funktion, den ItemType und die ItemID mit um die jeweiligen Objekte zu löschen, das klappt auch prima, ich bin mir aber sicher, dass das noch besser geht:

    PHP-Code:
    function deleteItem($id)
        {
            switch (
    $_POST['itemType'])
            {
                case 
    'terrarium':
                    foreach (
    $GLOBALS['json'] as $key => $item)
                    {
                        if (
    $item['id'] === $_POST['id'])
                        {
                            unset(
    $GLOBALS['json'][$key]);
                            break;
                        }
                    }
                case 
    'sensor':
                    foreach (
    $GLOBALS['json'] as $key => $terra)
                    {
                        foreach (
    $terra['sensoren'] as $skey => $sensor)
                        {
                            if(
    $sensor['id'] === $_POST['id'])
                            {
                                unset(
    $GLOBALS['json'][$key]['sensoren'][$skey]);
                                break;
                            }
                        }
                    }
                case 
    'geraet':
                    foreach (
    $GLOBALS['json'] as $key => $terra)
                    {
                        foreach (
    $terra['geraete'] as $gkey => $geraet)
                        {
                            if(
    $geraet['id'] === $_POST['id'])
                            {
                                unset(
    $GLOBALS['json'][$key]['geraete'][$gkey]);
                                break;
                            }
                        }
                    }
                case 
    'zeit':
                    foreach (
    $GLOBALS['json'] as $tkey => $terra)
                    {
                        foreach (
    $terra['geraete'] as $gkey => $geraet)
                        {
                            foreach (
    $geraet['schaltung'] as $skey => $schaltung)
                            {
                                if(
    $schaltung['id'] === $_POST['id'])
                                {
                                    unset(
    $GLOBALS['json'][$tkey]['geraete'][$gkey]['schaltung'][$skey]);
                                    break;
                                }
                            }
                        }
                    }
            }
        } 
    Das geht doch sicherlich auch irgendwie rekursiv, habt Ihr da eine Idee?

    mit besten Grüßen und ein schönes WE wünschend
    Balli


  • #2
    zuerst mal solltest du den ganzen Kram mit dem $GLOBALS weglassen, wenn das Projekt wächst wird das irgendwann nicht mehr nachvollziehbar sein (auch für dich selbst nicht), benutz halt den Rückgabewert der Funktion. Was hast du denn schon rekursiv probiert?
    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

    Kommentar


    • #3
      Das gilt nicht nur für $GLOBALS, auch $_POST und ähnliches haben da nix drin verloren. Alle Abhängigkeiten werden der Funktion als Parameter übergeben, das Ergebnis wird mit return zurückgegeben. Damit vermeidet man hässliche Bugs (wie das der Parameter $id gar nicht benutzt wird), Dokumentiert automatisch sein Code und der Code ist so eher wiederverwendbar.

      Wie eine Rekursivefunktion erstellt wird, habe ich letzten da geschreiben:

      https://www.php.de/forum/webentwickl...87#post1489187

      Die Vorgehensweise ist übertragbar (erst ohne Rekursion, auf einen ebenen begrenzt -> danach rekursiv), aber der Code passt nicht 1:1.

      Kommentar


      • #4
        Vielleicht schaust du dir auch mal JsonPath an...
        https://github.com/Peekmo/JsonPath
        Tutorials zum Thema Technik:
        https://pilabor.com
        https://www.fynder.de

        Kommentar


        • #5
          Hi,
          vielen Dank für eure Antworten. Das mit den Globals habe ich eingeführt, damit ich Code einspare, es handelt sich bereits um die finale Version (.d.h. alles arbeitet genauso, wie es soll). Ist, also dennoch schlechter Stil bei php? Mir geht es jetzt vornehmlich darum den Code zu optimieren.

          Ich hatte gedacht, dass ich die rekursive Funktion in etwa so aufbaue:
          PHP-Code:
          foreach ($GLOBALS['json'] as $key => $terra)
                          {
                              foreach (
          $terra['geraete'] as $gkey => $geraet)
                              {
                                  if(
          $geraet['id'] === $_POST['id'])
                                  {
                                      unset(
          $GLOBALS['json'][$key]['geraete'][$gkey]);
                                      break;
                                  }
                              }
                          }

          =>

          function 
          rekursiveforeach()
          {
            foreach (
          $GLOBALS['json'] as $key => $terra)
             {
                  
          //testen ob ein Element ein array ist
                  
          if(is_array($terra[$key])
                  {
                       
          rekursiveforeach()  //hier bin ich mir nicht sicher wie ich die keys und inhalte übergeben sollte
                  
          }
                  elseif(
          $key === "id" && $terra['id'] === $_POST['id')
                  {
                      unset(
          $GLOBALS['json'][$key]['geraete'][$gkey]);//wie kriege ich es hin, dass hier dann tatsächlich die Werte im Array richtig gesetzt werden, so dass ich den Spaß für jeden Case nehmen kann
                      
          return;         
                  }
                  else
                  {
                      echo  
          "ERROR";
                      return;
                  }
             }

          Das würde ich gerne einmal sehen wollen, weiterhin werde ich mir das Modul json-Paths mal genauer anschauen.
          mit besten Grüßen
          Balli


          Kommentar


          • #6
            Es gibt keinen Grund $GLOBALS zu verwenden. Das hat nur Nachteile und keine Vorteile.

            Kommentar


            • #7
              Dein Problem fängt schon sehr früh an. Vielleicht hast du es bei chorn überlesen aber
              PHP-Code:
              function loadJSON()
                  {
                      
              $jsonfile file_get_contents('../json/terra.json');
                      
              $GLOBALS['json'] = json_decode($jsonfiletrue); // decode the JSON into an associative array
                  

              diese Funktion sollte etwas zurückgeben, also ein Wert, ein Array oder ein Objekt.
              Du schreibst direkt in das globale Array und das macht man nicht, da Fehlersuche erschwert und Code schlecht wartbar wird.

              Warum du diesen Zweizeiler in eine Funktion quetscht weiss ich auch nicht, Vorteile sehe ich da nicht, zumal du nicht mal die zu öffnende Datei übergibst.

              Dazu fällt mir noch auf, dass die Pfade
              Code:
              ../json/terra.json

              nicht relativ sondern absolut vom Wurzelverzeichnis(root) aus angegeben werden sollten.

              Siehe auch das Handbuch zu functions

              Kommentar

              Lädt...
              X