Zugriffsarray, das von einer Funktion in PHP zurückgegeben wird

88

Ich verwende eine Vorlagen-Engine, die Code an der gewünschten Stelle in meine Site einfügt.

Ich habe eine Funktion geschrieben, um auf etwas zu testen, das ziemlich einfach ist:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

Das Problem ist, dass $ this-> Daten privat sind und ich nicht überall darauf zugreifen kann. Daher muss ich getData () verwenden. was mein Problem verursacht.

$this->getData()['a']['b']

funktioniert nicht und das erstmalige Zuweisen des Werts funktioniert auch nicht, da er direkt in einem if () -Block verwendet wird.

Irgendwelche Ideen?

Enyo
quelle
Das Zuweisen des Rückgabewerts funktioniert definitiv und ist der einzige Weg. Können Sie uns Ihren nicht funktionierenden Code zeigen?
Anti Veeranna
Nun, es funktioniert nicht, weil der Code in ein if (/ * Code hier * /) eingefügt wird. Ich kann die Daten also nicht einfach vorher zuweisen.
Enyo
1
Was um alles in der Welt bauen Sie überhaupt? :) etwas mit eval?
Anti Veeranna
Was versuchst du zu überprüfen? Versuchen Sie festzustellen, ob das Array-Element vorhanden ist und einen nicht leeren Wert hat? Hierfür können Sie die Funktion 'leer' verwenden. Diese Frage braucht mehr Klarheit!
txwikinger
Wie wird (war) der von Ihnen zurückgegebene Zeichenfolgenwert myfunction()weiter verarbeitet? Dieser Teil fehlt in Ihrer Frage.
hakre

Antworten:

134

Seit PHP 5.4 ist genau das möglich:

getSomeArray()[2]

Referenz: https://secure.php.net/manual/en/language.types.array.php#example-62

Unter PHP 5.3 oder früher müssen Sie eine temporäre Variable verwenden.

Enyo
quelle
4
Ich habe PHP 5.4.11-1~precise+1und diese Funktion funktioniert nicht! Erhaltene Nachricht als AntwortParse error: syntax error, unexpected '['
Eugene
1
+ Eugene hast du es zum Laufen gebracht? Vielleicht haben andere das gleiche Problem.
Enyo
2
Es hat bis PHP 5.4 gedauert, um die von Funktionen zurückgegebene Array-Notation zu unterstützen?! Was für ein böser Fehler.
Basil Musa
Und dann versuchen Sie, das erste Element eines von array_filter generierten Arrays zu erhalten und zu weinen
Loupax
17

Sie können so etwas nicht verwenden:

$this->getData()['a']['b']

Das heißt, die Array-Zugriffssyntax ist nicht direkt bei einem Funktionsaufruf möglich.

Sie müssen eine temporäre Variable wie diese verwenden:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

In Ihrem Fall bedeutet dies wahrscheinlich, dass Sie Folgendes verwenden:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

Sie müssen :

  • Rufen Sie zuerst Ihre getData()Methode auf und speichern Sie den Rückgabewert in einer temporären Varibale
  • Verwenden Sie dann diese temporäre Variable für Ihren Test

Sie haben nicht viel Auswahl, eigentlich ...

Pascal MARTIN
quelle
Nun, wie gesagt, mein Problem ist, dass dieser Code direkt in if eingefügt wird (/ * Code geht hierher * /), so dass das Definieren einer Funktion dort nicht wirklich möglich ist ...
enyo
Können Sie das Ergebnis des Methodenaufrufs nicht einer Variablen vor der if-Anweisung zuweisen und diese Variable in der if-Anweisung verwenden, anstatt direkt zu versuchen, die Methode aus der if-Anweisung aufzurufen?
Pascal MARTIN
1
Leider nein ... Dies ist eine Template-Engine, über die ich keine Kontrolle habe.
Enyo
12

Ok ... anscheinend gibt es wirklich keinen besseren Weg, also werde ich mir mit einer nicht so schönen Lösung antworten:

Ich habe die Funktion erstellt:

arrayGet($array, $index) { return $array[$index]; }

Und benutzte es so:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

Das ist nicht schön, funktioniert aber.

Enyo
quelle
1

$this->dataist immer zugänglich, wenn es geschützt ist. ist nicht von überall zugänglich. Wenn Sie also Ihren Code zurückgeben und dieser als solcher ausgewertet wird, sollte er in Ordnung sein.$object->data$this

Übrigens gibt es einen Fehler in Ihrem Code: Die Anführungszeichen müssen maskiert werden.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
Soulmerge
quelle
Ja, tut mir leid ... Ich habe meinen Beitrag korrigiert: $ this-> Daten sind natürlich privat. Außerdem wurde mein Tippfehler beim Erstellen des Fehlers korrigiert.
Enyo
1

Es ist ab PHP Version 5.4 möglich.

Wenn Sie nicht über eine temporäre Variable wollen dafür und Ihre PHP - Version ist weniger als 5,4 , als Sie noch ein paar eingebauten Funktionen verwenden können , das erste oder das letzte Element zu erhalten:

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

Edit: !!! Bitte beachten Sie, dass PHP in späteren Versionen (5.4+) einen Hinweis auslöst, da end nur Variablen als Parameter erwartet.

Lajos Meszaros
quelle