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?


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.


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 ...


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.


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)'; }

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.