Ankündigung

Einklappen
Keine Ankündigung bisher.

Funktion | PHP

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

    Funktion | PHP

    Hallo zusammen,

    ich habe nachfolgende Funktion ...

    Da sieht man im ersten Logausdruck, dass ich (in $params) 2 "homeapplinces" habe, somit ein Array mit zwei Einträgen [0] = Geschirrspüler und [1] = Waschmaschine.

    Irgendwie habe ich Tomaten auf den Augen ...
    Im zweiten Logausdruck, nach "foreach" sehe ich aber nur den Inhalt des Arrays [0] ... Ich hätte einen zweiten Eintrag im LOG für das Array [1]

    Ich vermute, dass es schon spät ist und ich die "Kleinigkeit" nicht mehr sehe :-(
    PHP-Code:
        public function foreachKeyIndex($params = array(), $i 'data'$ii 'homeappliances')
        {
            if (isset(
    $params) && is_array($params) && array_key_exists($ii$params[$i])) {
                
    $this->logKlasse('foreach/params ................. '.serialize($params));
                
    // foreach/params ................. a:1:{s:4:"data";a:1:{s:14:"homeappliances";a:2:{i:0;a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}i:1;a:7:{s:4:"name";s:13:"Waschmaschine";s:5:"brand";s:5:"BOSCH";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:0;s:4:"type";s:6:"Washer";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}}}}
                
    foreach ($params[$i][$ii] as $index) {
                    if (isset(
    $index)) {
                        
    $this->logKlasse('foreach/index .................. '.serialize($index));
                        
    // foreach/index .................. a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
                        
    return $index;
                    }
                }
            }
        } 


    Dies hier wäre noch die Abfrage:
    PHP-Code:
    $jsondata '{"data":{"homeappliances":[{"name":"Geschirrspüler","brand":"SIEMENS","vib":"SX578S06TE","connected":true,"type":"Dishwasher","enumber":"SX578S06TE/01","haId":"SIEMENS-SX578S06TE-68A40E0021F0"},{"name":"Waschmaschine","brand":"BOSCH","vib":"SX578S06TE","connected":false,"type":"Washer","enumber":"SX578S06TE/01","haId":"SIEMENS-SX578S06TE-68A40E0021F0"}]}}';
    $ho json_decode($jsondatatrue);
    logic_setOutput($id13serialize($ho));
    //    a:1:{s:4:"data";a:1:{s:14:"homeappliances";a:2:{i:0;a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}i:1;a:7:{s:4:"name";s:13:"Waschmaschine";s:5:"brand";s:5:"BOSCH";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:0;s:4:"type";s:6:"Washer";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}}}}


    $appliance $client->foreachKeyIndex($ho'data''homeappliances');

    for (
    $i 1$i 9$i++)
    {
        
    logic_setOutput($id$iserialize($appliance));
        
    LB_LBSID_Debug($id$OAuth.'$appliance ................... '.serialize($appliance), 6$UserLogLevelfalse);
    }

    /** LOG-Ausdruck:
    LBS19900070 (ID759) LOG_INFO__ | EXE | Home-Connect | OAuth2 | $appliance ................... a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
    LBS19900070 (ID759) LOG_INFO__ | EXE | Home-Connect | OAuth2 | $appliance ................... a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
    LBS19900070 (ID759) LOG_INFO__ | EXE | Home-Connect | OAuth2 | $appliance ................... a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
    LBS19900070 (ID759) LOG_INFO__ | EXE | Home-Connect | OAuth2 | $appliance ................... a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
    LBS19900070 (ID759) LOG_INFO__ | EXE | Home-Connect | OAuth2 | $appliance ................... a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
    LBS19900070 (ID759) LOG_INFO__ | EXE | Home-Connect | OAuth2 | $appliance ................... a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
    LBS19900070 (ID759) LOG_INFO__ | EXE | Home-Connect | OAuth2 | $appliance ................... a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
    LBS19900070 (ID759) LOG_INFO__ | EXE | Home-Connect | OAuth2 | $appliance ................... a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
    **/ 
    Zuletzt geändert von coliflower; 28.12.2017, 00:45.
    Danke und LG, Dariusz
    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

    #2
    Hi Dariusz,

    ohne jetzt genauer in den Code geschaut zu haben: Kann es sein, dass die Funktionsdeklaration falsch ist? Bei Dir wird dort ja direkt ein neues Array zugewiesen resp Werte. Bei mir sieht das immer so aus:

    Code:
    funktion foo($param1, $param2) {...
    Nur so als Idee...
    Kind regards,
    Yves

    Kommentar


      #3
      Was soll die Funktion denn machen?
      Es ist klar, dass nur das erste Element bearbeitet wird, denn beim return $index ist die Funktion beendet.

      Kommentar


        #4
        Zitat von jonofe Beitrag anzeigen
        Was soll die Funktion denn machen?
        Es ist klar, dass nur das erste Element bearbeitet wird, denn beim return $index ist die Funktion beendet.
        Die Funktion ist ein Bestandteil einer Klasse.
        Die Eigenschaft $params ist ein Array - siehe oben - mit zwei "Datensätzen" für zwei Haushaltsgeräte (Geschirrspüler und Waschmaschine).
        Diese zwei Datensätze (Arrays) haben - wenn ich mich nicht irre - die Position:

        $params['data']['homeappliances'][0] = Geschirrspüler und
        $params['data']['homeappliances'][1] = Waschmaschine.

        Um aus der Funktion/Klasse den Wert im LBS "ziehen" zu können, muss ich - ich hoffe ich irre mich nicht wieder - den Wert (Eigenschaft/Variable) mit "return" abschließen ...?

        Was ich möchte ist, dass ich die zwei Datensätze ins LOG schreibe und den LBS-Ausgängen zuweise (lt. Definition sind derzeit maximal 8 Datensätze möglich), deshalb "foreach $params['data']['homeappliances']" ...
        PHP-Code:
        $appliance $client->foreachKeyIndex($ho'data''homeappliances');

        for (
        $i 1$i 9$i++)
        {
            
        logic_setOutput($id$iserialize($appliance));
            
        LB_LBSID_Debug($id$OAuth.'$appliance ................... '.serialize($appliance), 6$UserLogLevelfalse);


        Ich hoffe, ich konnte zumindest das "warum" sowie das "was ich möchte", erklären.

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

        Kommentar


          #5
          Wenn die Funktion nur das Logging machen soll, dann würde ich es vermutlich so machen:

          PHP-Code:

          function foreachKeyIndex($params)
          {
              if (
          is_array($params) && array_key_exists('data'$params) && array_key_exists('homeappliances'$params['data'])) {
                  
          $this->logKlasse('foreach/params ................. ' json_encode($params));
                  foreach (
          $params[$i][$ii] as $index) {
                      
          $this->logKlasse('foreach/index .................. ' json_encode($index));
                  }
              }

          Vielleicht erklärst du noch mal, was die Funktion am Ende zurückliefern soll?

          Kommentar


            #6
            Zitat von jonofe Beitrag anzeigen
            Vielleicht erklärst du noch mal, was die Funktion am Ende zurückliefern soll?



            Siehe #4, oder meinst du eh #4 ?
            Danke und LG, Dariusz
            GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

            Kommentar


              #7
              Okay, hat sich überschnitten...

              Was genau soll am Ausgang ausgegeben werden?

              2 Ausgänge und jeder enthält den JSON String eines Geräts?

              Dann könntest du es so machen:

              PHP-Code:
              function foreachKeyIndex($params)
              {
                  
              $result = array();
                  if (
              is_array($params) && array_key_exists('data'$params) && array_key_exists('homeappliances'$params['data'])) {
                      
              $this->logKlasse('foreach/params ................. ' json_encode($params));
                      foreach (
              $params[$i][$ii] as $index) {
                          
              $this->logKlasse('foreach/index .................. ' json_encode($index));
                          
              $result[] = json_encode($index);
                      }
                  }
                  return 
              $result;

              Dann wäre die Rückgabe der Funktion in deinem Fall ein Array mit 2 Elemente. $result[0] = JSON String des ersten Geräts und $result[1] = JSON String des ersten Geräts.

              Kommentar


                #8
                Zitat von starwarsfan Beitrag anzeigen
                Nur so als Idee...

                Danke Yves für deine Rückmeldung !

                Die Werte sind quasi Default-Werte, wen ich die Funktion aufrufe und keine Werte übergebe ...
                Danke und LG, Dariusz
                GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                Kommentar


                  #9
                  Danke, das fehlende $result war's
                  Die Funktion schreibt jetzt pro Datensatz ins LOG:
                  Code:
                  foreach/index .................. a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
                  
                  foreach/index .................. a:7:{s:4:"name";s:13:"Waschmaschine";s:5:"brand";s:5:"BOSCH";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:0;s:4:"type";s:6:"Washer";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}

                  Jetzt fehlt mir noch, dass die Datensätze, im LBS den bis zu 8 (Geräten) LBS-Ausgängen zugewiesen werden.

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

                  Kommentar


                    #10
                    Zitat von coliflower Beitrag anzeigen
                    Jetzt fehlt mir noch, dass die Datensätze, im LBS den bis zu 8 (Geräten) LBS-Ausgängen zugewiesen werden.

                    Mit folgendem LBS-Code ...
                    PHP-Code:
                        $appliance $client->foreachKeyIndex($ho'data''homeappliances');

                        
                    $result = array();
                        foreach (
                    $appliance    as $geraet) {

                            
                    $result[] = $geraet;
                            
                    LB_LBSID_Debug($id$OAuth.'$appliance ................... '.serialize($geraet), 6$UserLogLevelfalse);
                        } 

                    ... kann ich folgende Logeinträge mit zwei "Datensätzen" generieren (das sind nicht die Logeinträge die direkt in/aus der Funktion/Klasse wie oben besprochen erzeugt werden):
                    Code:
                    LBS19900070 (ID759) LOG_INFO__ | EXE | Home-Connect | OAuth2 | $appliance ................... a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}
                    
                    LBS19900070 (ID759) LOG_INFO__ | EXE | Home-Connect | OAuth2 | $appliance ................... a:7:{s:4:"name";s:13:"Waschmaschine";s:5:"brand";s:5:"BOSCH";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:0;s:4:"type";s:6:"Washer";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}

                    Gibt es da nicht einen "Trick" wie man jeweils einen "Datensatz", sauber/elegant, einem LBS-Ausgang (1 bis 8) zuweisen kann ?

                    Das "1" unten im Code irgendwie "automatisieren" damit für jeden Datensatz ein LBS-Ausgang von 1 bis zB hier 2 (max. 8) zugewiesen wird ...
                    PHP-Code:
                    logic_setOutput($id1serialize($geraet)); 
                    DANKE vorab !
                    Zuletzt geändert von coliflower; 28.12.2017, 11:27.
                    Danke und LG, Dariusz
                    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                    Kommentar


                      #11
                      Das $result = array(); und das $result[] = $geraet; kannst du hier weglassen. Du erzeugst damit nur ein identisches array zu $appliances.

                      Statt foreach könntest du auch eine for Schleife machen, dann kannst du direkt die Daten an den LBS Ausgängen ausgeben:

                      PHP-Code:

                      $output_offset 
                      5;
                      $appliance $client->foreachKeyIndex($ho'data''homeappliances');
                      for (
                      $i=0$i<count($appliance);$i++) {
                         
                      LB_LBSID_Debug($id$OAuth.'$appliance ................... '.serialize($appliance[$i]), 6$UserLogLevelfalse);
                         
                      logic_setOutput($id,$output_offset+$ijson_encode($appliance[$i]);

                      $output_offset ist dabei die Nummer des ersten Ausgangs, ab dem die Infos ausgegeben werden.
                      Wenn du also z.B. 3 Geräte hast und $output_offset=5 ist, dann werden die Daten an den Ausgängen 5,6,7 ausgegeben.

                      Warum nimmst du serialize() und nicht json_encode()? json_encode() hat den Vorteil, dass du direkt die JSON LBS verwenden kannst, um Daten aus dem String raufzusplitten in einzelne Attribute um diese dann direkt weiterzuverarbeiten. Also z.B. 'name', 'brand', 'connected', usw.

                      Kommentar


                        #12
                        DANKE André, ich werde es testen :-) !

                        Zitat von jonofe Beitrag anzeigen
                        Warum nimmst du serialize() und nicht json_encode()? json_encode() hat den Vorteil, dass du direkt die JSON LBS verwenden kannst, um Daten aus dem String raufzusplitten in einzelne Attribute um diese dann direkt weiterzuverarbeiten. Also z.B. 'name', 'brand', 'connected', usw.
                        Ich brauche das Array noch in einem weiteren LBS mit SEE (Server Send Event), da ein zyklisches direktes Abfragen via API sehr stark eingeschränkt ist und ein zu oftmaliges Abfragen das Account sperrt - deshalb wird SEE zur Verfügung gestellt (im Log funktioniert das auch schon sehr gut) ...
                        Erst in weiterer Folge werde ich JSON bzw. mit "LIST" arbeiten, wenn ich die Informationen ausgeben werde.
                        Für jeden "Datensatz" (=eines pro Haushaltsgerät, wenn im Account verknüpft) der OAuth2 hergibt/erkennt gibt es ein SEE-LBS, da jedes Haushaltsgerät eine eigene (im "Datensatz" vorhandenem Wert, der haID) ID hat die abgefragt werden kann ...

                        Diese SEE-Informationen dann elegant/logisch/... in der VISU darzustellen, das ist eine andere Geschichte ;-)

                        Danke, melde mich noch nach dem Test :-)
                        Danke und LG, Dariusz
                        GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                        Kommentar


                          #13
                          Das würde aber mit JSON auch funktionieren. Mit json_decode($json_string,true) bekommst du dann auf der anderen Seite wieder das array. Serialize funktioniert natürlich auch dafür.

                          Kommentar


                            #14
                            Zitat von coliflower Beitrag anzeigen
                            DANKE André, ich werde es testen :-) !
                            DANKE, funktioniert perfekt :-) !
                            Danke und LG, Dariusz
                            GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                            Kommentar


                              #15
                              Hallo André,

                              ich habe doch noch eine Frage zum Ausgabeformat (im ersten LBS):
                              PHP-Code:
                              $output_offset 1;
                              $appliance $client->foreachKeyIndex($ho'data''homeappliances');
                                  for (
                              $i=0$i count($appliance); $i++) {
                                      
                              LB_LBSID_Debug($id$OAuth.'$appliance ................... '.serialize($appliance[$i]), 6$UserLogLevelfalse);
                                      
                              logic_setOutput($id$output_offset $iserialize($appliance[$i]));
                                  } 


                              Wenn ich das ohne JSON-Format am Ausgang übergebe (logic_setOutput($id, $output_offset + $i, serialize($appliance[$i]));), ist das dann auch noch ein Array am Eingang des zweiten LBS (SSE) ?

                              Am Eingang des zweiten LBS (SSE) kommt:
                              Code:
                              a:7:{s:4:"name";s:15:"Geschirrspüler";s:5:"brand";s:7:"SIEMENS";s:3:"vib";s:10:"SX578S06TE";s:9:"connected";b:1;s:4:"type";s:10:"Dishwasher";s:7:"enumber";s:13:"SX578S06TE/01";s:4:"haId";s:31:"SIEMENS-SX578S06TE-68A40E0021F0";}

                              Wenn ich aus dem Eingangswert versuche den NAMEN zu "ziehen" ...
                              PHP-Code:
                              //         if (isset($haID) && is_array($haID) && array_key_exists('name', $haID)) {
                                      
                              if (isset($haID)) {
                                          
                              $value $haID['name'];
                                          
                              logExtra('value ............ '.$value);
                                          
                              logic_setOutput($id3$value);
                                          
                              writeToCustomLog("Home-Connect LBSLBSID"'6'"LBSLBSID (ID$id) haID-name: ".$value);        
                                          
                              logExtra('name ............. '.$value);
                                      } 

                              ... dann erhalte ich an A3 nur ein "a", siehe Grafik unten:

                              Bildschirmfoto 2017-12-28 um 16.52.48.png


                              Anscheinend habe ich in den letzten Monaten vieles über PHP vergessen
                              Oder der Eingangswert am zweiten LBS ist ein simpler STRING und ich muss tatsächlich am Ausgang des ersten LBS in JSON übergeben ?

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

                              Kommentar

                              Lädt...
                              X