15 Stimmen

Ich kann eine Variable in der Ausgabe von print_r() sehen, weiß aber nicht, wie ich im Code darauf zugreifen kann

Ich habe gegoogelt, Devel installiert, Drupal für Firebug, aber ich kann es nicht finden.

Ich fand was Ich will, ich weiß wobei es ist; ich weiß es nur nicht wie um es zu bekommen.

Ich werde dies in Code-Klammern setzen, aber Devel sagt mir, dass der Dateiname (den ich in die .tpl.php-Datei einfügen möchte) hier steht:

field\_image (Object) stdClass 
  handler (Object) views\_handler\_field\_field 
    view (Object) view 
      result (Array, 2 elements) 
        0 (Object) stdClass 
          \_field\_data (Array, 1 element) 
            nid (Array, 2 elements) 
              entity (Object) stdClass
                field\_image (Array, 1 element) 
                  und (Array, 1 element)
                    0 (Array, 11 elements)                                      
                      filename (String, 23 characters ) FILENAME.jpg

Wie bekomme ich also die Datei FILENAME.jpg mit PHP zur Ausgabe?

<?php print $something->other; ?>

1 Stimmen

SimpleXML: Wenn Sie eine print_r eines SimpleXMLElement-Objekts, werden hier Antworten gegeben: Wie erhält man Werte von Xml-Elementen? y Zugriff auf @Attribut aus SimpleXML

0 Stimmen

Nochmals vielen Dank, hakre. Tolle Antworten und Kommentare, und ich beziehe mich immer noch hin und wieder auf diesen Beitrag, wenn ich in den Code eintauche, da ich meistens mit UX- und designbezogenen Aufgaben beschäftigt bin.

0 Stimmen

Untersuchen Sie Ihre print_r-Ausgabe interaktiv (kudos @mario): array.include-once.org

18voto

hakre Punkte 184133

Wenn Sie einen Wert aus einer Variablen lesen wollen, müssen Sie wissen, welchen Ausdruck Sie formulieren müssen, um auf diesen Wert zuzugreifen.

Für einen einfachen Variablenwert ist dies einfach, Sie nehmen einfach den Variablennamen und greifen auf ihn als Variable zu, indem Sie ihm das Präfix $ Zeichen:

var_dump($variable);

Este ist hier dokumentiert .

Dies funktioniert jedoch nur für einfache Datentypen wie string ou integer . Es gibt auch zusammengesetzte Datentypen, nämlich array y object . Sie können weitere Datentypen enthalten, sei es einfach oder zusammengesetzt. Im PHP-Handbuch können Sie lernen, wie man Zugriff auf die Werte eines Arrays und wie können Sie sie von einem Objekt aus aufrufen . Ich denke, das wissen Sie schon ein bisschen, also nur, weil ich es hier verlinkt habe.

Wenn Sie das gelernt haben, können Sie das dann kombinieren. Wenn z.B. ein Array in einem Objekt vorhanden ist und darin eine Zeichenkette enthalten ist, die Sie erhalten möchten, müssen Sie die $ Zeichen und den Variablennamen mit den benötigten Accessors, Eigenschaftsnamen und Array-Schlüsseln. Dann erhalten Sie Ihren Wert. Die Daten, die Sie gepostet haben, zeigen, dass Sie ein Objekt haben, das einige andere Objekte und Arrays hat, und am Ende finden Sie den Variablennamen.

Ein Beispiel für eine Kombination:

var_dump($variable->handler->view[0]->_field_data);

Dies beruht auf den von Ihnen oben angegebenen Daten. $variable ist der Ort, an dem Sie beginnen, -> wird verwendet, um auf Objektmitglieder zuzugreifen, die dann benannt werden müssen (wie ein Name für eine Variable): handler . Wie Sie in Ihrer Debug-Ausgabe gesehen haben, ist handler ein Objekt ist, müssen Sie wieder die -> zum Zugriff auf die view Mitglied davon.

Jetzt view ist anders, weil es ein Array ist. Sie greifen auf die Werte eines Arrays zu, indem Sie [] und den Schlüssel dort hineinstecken. Der Schlüssel in meinem Beispiel ist eine Zahl, 0 . Und da der Wert dieses Array-Eintrags wieder ein Objekt ist, müssen Sie im nächsten Schritt -> wieder.

Sie können dieses Spiel fortsetzen, bis Sie das Element erreichen, das Sie interessiert. Die Debug-Ausgabe, die Sie bereits haben, hilft Ihnen, den Ausdruck zu schreiben, der den Wert zurückgibt. Möglicherweise ist es das:

$field_image->handler->view->result[0]->_field_data['nid']['entity']->field_image['und'][0]['filename']

Aber ich kann das hier auf meinem System nicht in vollem Umfang validieren.

Wenn man etwas herausfinden will, ist es jedoch hilfreich, die folgenden Informationen zu nutzen var_dump da Sie den Ausdruck Schritt für Schritt erweitern können, bis Sie das Element finden. Wenn Sie einen Fehler machen, sehen Sie das sofort. Manchmal hilft es, ein die(); nach dem var_dump Anweisung, um die Antwort nicht zu beenden, bevor sie zu viele andere Daten enthält, die die Informationen vor Ihnen verbergen würden. Das devel-Plugin bietet zusätzliche Debug-Routinen, um Werte prominent zu dumpen.

1 Stimmen

Da der OP Devel installiert hat, kann er dessen Debugging-Funktion nutzen, einschließlich dsm() .

1 Stimmen

Arrays und Objekte "enthalten" keine Datentypen.

1 Stimmen

Der Unterschied besteht darin, dass eine Variable semantisch gesehen mit Sicherheit tut enthalten einen Wert, aber nichts enthält andere Datentypen als den Sprach- und Programmkontext. Aber ich habe es verstanden :P

6voto

Nanne Punkte 63372

Wenn dies Ihr Ziel ist:

field_image (Object) stdClass 
  handler (Object) views_handler_field_field 
    view (Object) view 
      result (Array, 2 elements) 
        0 (Object) stdClass 
          _field_data (Array, 1 element) 
            nid (Array, 2 elements) 
              entity (Object) stdClass
                field_image (Array, 1 element) 
                  und (Array, 1 element)
                    0 (Array, 11 elements)                                      
                      filename (String, 23 characters ) FILENAME.jpg

Ich vermute, dass Sie es mit finden können:

field_image->handler->view->result[0]->_field_data['nid'][entity]->field_image['und'][0]['filename]

Es könnte ein Fehler drin sein, aber die allgemeine Idee ist: Wenn Sie ein Objekt haben, holen Sie die Variable mit -> und wenn Sie ein Array haben, verwenden Sie [key] .

0 Stimmen

Ja, es gibt ein oder zwei Fehler, aber die Grundidee hat funktioniert. Vielen Dank für die Antwort! Prost!

4voto

Beto Aveiga Punkte 3176

Nehmen wir an, Sie haben ein Knotenobjekt in $node. Sie können seine Werte sehr schön mit drucken:

dpm($node); // remember this function is declared in devel module

Dann können Sie die Informationen von $node sehen und die internen Felder mit einem Klick erweitern. Und mit einem Doppelklick auf das Feld können Sie dessen PHP-Pfad sehen.

Devel Information of a Drupal node object

Sie werden dieses Ergebnis erhalten:

Devel showing the path after double clicking a field

Ich hoffe, das hilft!

PD: Ich vermute, dass diese Funktion in D6's dpm nicht verfügbar ist.

3voto

Shef Punkte 43517

Versuchen Sie es:

$field_image->handler->view->result[0]->_field_data['nid']['entity']->field_image['und'][0]['filename']

0voto

Matt Punkte 412

Wenn Sie devel installiert haben und versuchen

krumo ($variable);

Denken Sie daran, dass standardmäßig nur Admin-Benutzer das Recht haben, den krumo-Befehl zu verwenden, aber das kann durch einen Blick auf die DEVEL-Rollenberechtigungen behoben werden. (Vergessen Sie nicht, diese Berechtigungen wieder zu entfernen, wenn Sie fertig sind)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X