Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] foreach - Array vs. Objekt

Einklappen

Neue Werbung 2019

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

  • [Erledigt] foreach - Array vs. Objekt

    Hallo zusammen,

    ich habe ein komische Problem mit der foreach Schleife.

    1. Ausgangspunkt:

    Ein Array mit einem Objekt an Index 0:
    PHP-Code:
    array(1) {
      [
    0]=>
      
    object(stdClass)#3 (3) {
        
    ["Id"]=>
        
    string(16"Id1363240"
        
    ["pseudonym"]=>
        
    string(9"Tester2p1"
        
    ["status"]=>
        
    string(7"invited"
      
    }

    Da ich nicht ausschliessen kann, dass in dem Array auch mal mehrere Objekte sind gehe ich mit foreach durch das Array:

    foreach ($members as $member)

    Danach ist in $member folgendes:
    PHP-Code:
    array(3) {
      [
    "Id"]=>
      
    string(16"Id1363240"
      
    ["pseudonym"]=>
      
    string(9"Tester2p1"
      
    ["status"]=>
      
    string(7"invited"

    2. Ausgangspunkt, der Member antwortet:

    Wieder ein Array mit Objekt an Index 0:
    PHP-Code:
    array(1) {
      [
    0]=>
      
    object(stdClass)#3 (3) {
        
    ["Id"]=>
        
    string(16"Id1363240"
        
    ["pseudonym"]=>
        
    string(9"Tester2p1"
        
    ["status"]=>
        
    string(8"accepted"
      
    }

    Wieder mit foreach bearbeitet:
    foreach ($members as $member) steht in $member aber:
    PHP-Code:
    object(stdClass)#3 (3) {
      
    ["Id"]=>
      
    string(16"Id1363240"
      
    ["pseudonym"]=>
      
    string(9"Tester2p1"
      
    ["status"]=>
      
    string(8"accepted"


    Warum hab ich beim ersten mal ein Array und beim zweiten mal ein Objekt? Kann mir bitte jemand einen Hinweis geben, wo ich weitere Informationen dazu finde, wie foreach mit den übergebenen Arrays und Objekten umgeht?

    Vielen Dank und viele Grüße
    HeckMc


  • #2
    die erste Ausgabe kann ich gar nicht nachvollziehen, die danach schon.
    2. Ausgabe: du hast ein array, das ein objekt enthält, durch foreach() bekommst du
    3. Ausgabe: das objekt

    es ist natürlich möglich, sich mit foreach() durch die öffentlichen properties eines Objekts zu bewegen …

    Kommentar


    • #3
      Das kann man nicht pauschal beantworten. Wenn Du in der Schleife bspw. Operationen auf die Daten vornimmst (wovon ich mal ausgehe), änderst Du vielleicht den Typ. foreach alleine hat damit nichts zu tun, es arbeitet ohnehin auf Kopien von Arrays.
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        Hallo,

        so geht es mir auch. Allerdings habe ich den Quellcode komplett abgesucht und $members wird sowohl im ersten als auch im zweiten Fall for foreach nicht verwendet.

        Viele Grüße
        HeckMc

        Kommentar


        • #5
          Hallo nochmal,

          also die erste foreach Schleife sieht wie folgt aus:

          PHP-Code:
          foreach ($members as $member)
                          {
                              
          logTraces (__FUNCTION__'Members will be notified'$member);
                              
                              
          //notifi invited users
                              
                              
          $notifiresponse notifiInvitation($member['Id'],$scid,$member$attributes$adminId);
           
                              if (
          $notifiresponse->status =='200')
                              {
                                  
          logTraces (__FUNCTION__'Successful Response to nofitication received'$notifiresponse);
                                  
                                  if (
          $notifiresponse->memberStatus == 'accepted'
                                  {
                                      
          $response ScAcceptInvitation($requester$scid$member$attributes);
                                  }
                                  elseif (
          $notifiresponse->memberStatus == 'refused'
                                  {
                                      
          $response ScRefuseInvitation($requester$notifiresponse$scid$member);
                                  }
                              } 
          Im zweiten Fall sieht es so aus:
          PHP-Code:
          foreach ($members as $member)
                  {
                      
          logTraces (__FUNCTION__'This is the member Parameter:'$member);
                      
                      
          $response ScAcceptInvitation($requester$scid$member$attributes);
                  } 
          Wie man sieht ist for dem log nichts mit $member geschehen und wie gesagt wie $members vom Aufruf bis zur foreach Schleife auch nicht angerührt.

          edit:
          Das Problem ist halt, dass ich beides mal ScAcceptInvitation ausführen möchte und es natürlich geschickt wäre, wenn der Zugriff auf die in $member enthaltenen "Parameter" beides mal gleich abläuft.
          Viele Grüße
          HeckMc

          Kommentar


          • #6
            Was passiert denn mit $response?
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              Ich vermute mal, das PHP aus einem StdClass-Object ein Array macht an der Stelle wo du es wie ein Array benutzt:

              PHP-Code:
              $member['Id'

              Kommentar


              • #8
                Schon richtig. Im Prinzip wird das aber nicht zurückgeschrieben, wenn man nicht as $key => & $value verwendet. Auch wenn Objekte als Referenz zuryckgegeben werden handelt es sich ja nicht um Variablenreferenzen. Sonst müßte:

                PHP-Code:
                $foo = new Foo;
                var_dump ((array) $foo); 
                $foo ja hier auch hinterher ein Array sein. Was ich zu bezweiflen wage.
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  Er sprach ja auch nicht davon das $members[0] ein Array ist, sondern $member

                  Kommentar


                  • #10
                    Ändert aber nichts an der Aussage.

                    $foo[0] erzeugt vielleicht ein Array für diesen Ausdruck. Aber schreibt es den auch zurück nach $foo? foreach ($object) macht die Variable ja auch nicht zum Array, sondern nur eine Kopie des Wertes im Ausdruck des each-Kontext.
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Zitat von nikosch Beitrag anzeigen
                      Was passiert denn mit $response?
                      $response ist ein Überbleibsel...es könnte auch einfach weg gelassen werden. Werds gleich mal aktualisieren. Danke.


                      Ich vermute mal, das PHP aus einem StdClass-Object ein Array macht an der Stelle wo du es wie ein Array benutzt:
                      Ich logge doch aber VOR der Verwendung schon $member. Daher kann es an der Verwendung sicher nicht liegen.

                      Danke erstmal für eure Mühe. Ich schau mir das später nochmal mit nem Bierchen an vllt. seh ich dann den Fehler.

                      Grüße
                      HeckMc

                      Kommentar


                      • #12
                        Mein Script sagt z.B. auch
                        Fatal error: Cannot use object of type Foo as array in D:\Workspace\Web\test\typtest.php on line 9
                        $member muss also bereits ein Array sein oder ArrayAccess o.ä. bietetn (was StdClass IMHO nicht bietet).
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          Hi,

                          ich werds mal isoliert betrachten ohne sämtlichen anderen Code. Ich werde berichten.

                          Grüße
                          HeckMc

                          Kommentar


                          • #14
                            Hallo zusammen,

                            ich habe die Erklärung gefunden. Natürlich ein Anfänger Fehler.

                            Als ich den kompletten anderen Code rausgelöscht habe, ist mir auch mein xmlrpc call in die Finger geraten. Dieser verwendet zwar nicht mein $members aber meine Eingangs bekommenen $params.

                            D.h. die Funktion wird mit einem Objekt $params aufgerufen. Aus diesem Objekt hole ich mir die $members. Da ich nicht ausschliessen kann, dass in $params->members ein array ist auf diesem Wege:

                            PHP-Code:
                            if (is_array($params->members)) $members $params->members;
                            else 
                            $members[] = $params->members
                            $params->members kann einmal so aussehen:
                            PHP-Code:
                            ["members"]=>
                              array(
                            2) {
                                [
                            0]=>
                                
                            object(stdClass)#3 (3) {
                                  
                            ["Id"]=>
                                  
                            string(16"Id1363240"
                                  
                            ["pseudonym"]=>
                                  
                            string(9"Tester2p1"
                                  
                            ["status"]=>
                                  
                            string(7"invited"
                                
                            }
                                [
                            1]=>
                                
                            object(stdClass)#4 (3) {
                                  
                            ["Id"]=>
                                  
                            string(16"Id1363240"
                                  
                            ["pseudonym"]=>
                                  
                            string(9"Tester2p1"
                                  
                            ["status"]=>
                                  
                            string(7"invited"
                                
                            }
                              } 
                            und mal so:
                            PHP-Code:
                            ["members"]=>
                              
                            object(stdClass)#3 (3) {
                                
                            ["Id"]=>
                                
                            string(16"Id1363240"
                                
                            ["pseudonym"]=>
                                
                            string(9"Tester2p1"
                                
                            ["status"]=>
                                
                            string(8"accepted"
                              

                            Und hier liegt mein Fehler. Ich bin davon ausgegangen, dass ich eine Kopie bekomme. Tatsächlich scheint es aber nur eine Referenz zu sein. Denn nach dem xmlrpc call ist sowohl mein $params->members ein array als auch mein komplettes $members.

                            Vielen Dank für den Hinweis, dass foreach nix dafür kann so habe ich meinen Fehler gefunden.

                            Kann mir jemand bitte meinen grundlegenden Fehler erklären? Also warum es so ist?

                            Vielen Dank,
                            HeckMc

                            Kommentar


                            • #15
                              if (is_array($params->members)) $members = $params->members;
                              else $members[] = $params->members;
                              Anscheinend trifft is_array wohl immer zu (was mich bei stdClass immer noch wundert). Deckt sich aber mit meiner obigen Aussage, dass Du sonst auch gar nicht auf Schlüssel per Array-Zugriff (['id']) zugreifen könntest.
                              --

                              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                              --

                              Kommentar

                              Lädt...
                              X