Ankündigung

Einklappen
Keine Ankündigung bisher.

Funktion | PHP

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

    #16
    serialize() macht genau wie json_encode() aus einem Array oder Object einen String. Dieser kann dann über LBS Grenzen hinweg transportiert werden. Will man dann im Ziel LBS wieder mit einem Array bzw. Object arbeiten, dann muss man zunächst ein unserialize bzw. ein json_decode() machen.

    Kommentar


      #17
      Hallo André,

      also doch ein String ...

      Zitat von jonofe Beitrag anzeigen
      ... dann muss man zunächst ein unserialize ...
      Das war das Zauberwort ... ich kannte es noch nicht, hatte damit noch nie zutun
      Danke und LG, Dariusz
      GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

      Kommentar


        #18
        Hallo André,

        ich hätte da noch eine Frage zum nachfolgenden Code.
        Ich bin wieder nach einer schlanken Lösung um aus den einzel JSONs ($cleanupH) bzw. ARRAYs ($doArray) die aus der foreach() resultieren können, einen einzigen JSON-String bzw. ein Array zu bauen ...

        Bei JSON muss ich vorher viel mit substr() arbeiten/nacharbeiten, wenn ich vorher jeden einzelnen JSON in ARRAY umwandle und danach irgendwie mit merge_array() aus der foreach() zusammenfassen könnte, dann wäre das einfacher (?)

        Hättest du da eine Idee ?

        PHP-Code:
        foreach ($sse as $index => $value)
        {
            list(
        $event$data$haid) = explode("\n"$value);
        //    value: event:NOTIFY[LF]data:{"items":[{"timestamp":1514831226,"handling":"none","uri":"/api/homeappliances/SIEMENS-SX578S06TE-68A40E0021F0/settings/BSH.Common.Setting.PowerState","key":"BSH.Common.Setting.PowerState","value":"BSH.Common.EnumType.PowerState.Off","level":"hint"}]}[LF]id:SIEMENS-SX578S06TE-68A40E0021F0
        //    event: event:NOTIFY
        //    data : data:{"items":[{"timestamp":1514831226,"handling":"none","uri":"/api/homeappliances/SIEMENS-SX578S06TE-68A40E0021F0/settings/BSH.Common.Setting.PowerState","key":"BSH.Common.Setting.PowerState","value":"BSH.Common.EnumType.PowerState.Off","level":"hint"}]}
        //    haid : id:SIEMENS-SX578S06TE-68A40E0021F0

            
        if ($data !== 'data:' || $data != '')
            {
                
        $cleanupV substr($data15);
        //    {"timestamp":1515070097,"handling":"none","key":"BSH.Common.Event.ProgramFinished","value":"BSH.Common.EnumType.EventPresentState.Present","level":"hint"}]}

                
        $cleanupH substr($cleanupV0, -2);
        //    {"timestamp":1515072642,"handling":"none","key":"BSH.Common.Event.ProgramFinished","value":"BSH.Common.EnumType.EventPresentState.Present","level":"hint"}
                
        $doArray json_decode($cleanupHtrue);
            }

        Danke und LG, Dariusz
        GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

        Kommentar


          #19
          Ich muss zugeben : Ich hab's nicht verstanden.

          mal ganz grundsätzlich : wenn du ein JSON hast und willst einzelne Daten daraus haben, dann nimmst du json_decode($json , true) und hast ein array bei dem du auf alle Elemente einfach zugreifen kannst. Die kannst du dann beliebig in ein neues array packen und dann mit json_encode() wieder einen string draus machen.

          Kommentar


            #20
            OK, ich möchte nicht aus einem String die Werte, sondern aus einzelnen Strings, einen Einzelnen :-)

            Sagen wir, die Variable $data oben im Code kann für jeden foreach() Datensatz (aus $value) einen "JSON"-String (verkürzt aus obigem Beispiel: data:{"items":[{"key":"value"}]} ) zur Verfügung stellen (die Anzahl der Strings ist nicht statisch und kann 0 oder zB 3 sein).

            Am Ende der foreach() benötige ich alle $data gemerged in einem String (JSON) oder in einem Array ...

            So sollte zB das Endergebnis aussehen (halt als String, hier zur Ansicht aufgedröselt):
            HTML-Code:
            {
                "data": {
                    "items": [
                        {
                            "timestamp": 1515064884,
                            "handling": "none",
                            "uri": "/api/homeappliances/SIEMENS-SX578S06TE-68A40E0021F0/status/BSH.Common.Status.DoorState",
                            "key": "BSH.Common.Status.DoorState",
                            "value": "BSH.Common.EnumType.DoorState.Closed",
                            "level": "hint"
                        },
                        {
                            "timestamp": 1515064884,
                            "handling": "none",
                            "uri": "/api/homeappliances/SIEMENS-SX578S06TE-68A40E0021F0/status/BSH.Common.Status.OperationState",
                            "key": "BSH.Common.Status.OperationState",
                            "value": "BSH.Common.EnumType.OperationState.Run",
                            "level": "hint"
                        },
                        {
                            "timestamp": 1515064884,
                            "handling": "none",
                            "uri": "/api/homeappliances/SIEMENS-SX578S06TE-68A40E0021F0/programs/active",
                            "key": "BSH.Common.Root.ActiveProgram",
                            "value": "Dishcare.Dishwasher.Program.PreRinse",
                            "level": "hint"
                        }
                    ]
                }
            }

            Wie man sieht, wäre das mergen von data:{"items":[{"key":"value"}]} aus obigem JSON-Beispiel "anstrengend" ... Wegen dem sich wiederholenden data:{"items":[...]} Bei einzelnen Arrays wären diese Wiederholungen absolut kein Problem - ich kann mich aber auch irren ...

            Ich könnte mir vorstellend, dass wenn man den Teilstring vorher in ein Array wandelt und die einzelnen Arrays merged, dass das "einfacher" wäre ...
            mit merge_array(array1, array2, array3) wäre das grundsätzlich einfach, ABER, würde das auch irgendwie automatisch aus der foreach() gehen ?
            Danke und LG, Dariusz
            GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

            Kommentar


              #21
              Hallo André,

              ich habe das Thema jetzt für mich gelöst ...
              Falls du es weiß und oder Lust darauf hast, mit zu zeigen, wie man solche Einzelarrays aus der foreach-Schleife elegant mergen kann, das wäre natürlich sehr nett :-)

              Auf jeden Fall, danke wie immer für deine Ideen :-)))
              Danke und LG, Dariusz
              GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

              Kommentar


                #22
                d.h. du hast drei Strings mit data/items und möchtest am Ende einen String mit data + 3 items? Richtig?

                Müsste dann ungefähr so funktionieren:

                PHP-Code:

                $result 
                = array('data' => array('items' => array());
                foreach (
                $sse as $value
                   
                $result['data']['items'][] = $value['data']['items']; 

                Kommentar


                  #23
                  Zitat von jonofe Beitrag anzeigen
                  am Ende einen String mit data + 3 items? Richtig?
                  Ein String mit data + items + [3 Datensätze] ... {"data":{"items":[{datensatz1},{datensatz2},{datensatz3}]}}
                  Wenn deine Frage das selbe ist, dann ja :-))

                  DANKE !
                  Danke und LG, Dariusz
                  GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                  Kommentar


                    #24
                    Genau das sollter der Dreizeiler oben machen.
                    Danach musst du dann nur noch serialize($result) oder json_encode($result) machen, je nachdem welche Art von String du möchtest.

                    Kommentar


                      #25
                      So 1:1 geht das nicht weil $value kein JSON und kein ARRAY ist, sondern ein "Unding" data:{"items":[{"key":"value"}]} - leider.
                      Aber nach Bereinigung von data: und vorheriger Umwandlung des Teilstrings zum Array, ist deine obige Lösung eleganter als meine jetzige ;-)
                      Danke !
                      Danke und LG, Dariusz
                      GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                      Kommentar


                        #26
                        Der Inhalt von "data" ist JSON, also das hier:

                        {"items":[{"timestamp":1514831226,"handling":"none","uri" :"/api/homeappliances/SIEMENS-SX578S06TE-68A40E0021F0/settings/BSH.Common.Setting.PowerState","key":"BSH.Common.S etting.PowerState","value":"BSH.Common.EnumType.Po werState.Off","level":"hint"}]}

                        Daher sollte es dann so funktionieren:

                        PHP-Code:

                        $result 
                        = array('data' => array('items' => array());
                        foreach (
                        $sse as $value) {
                           list(
                        $event$data$haid) = explode("\n"$value);
                           
                        $data json_decode(substr($data,5),true);
                           
                        $result['data']['items'][] = $data['data']['items'];

                        $result müsste dann das von dir gewünschte Array sein.


                        Kommentar


                          #27
                          Genauso habe ich es auch in etwa gelöst - danke :-)
                          Danke und LG, Dariusz
                          GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                          Kommentar

                          Lädt...
                          X