
dreftymac
Hintergrund
In jeder anderen Programmiersprache, die ich regelmäßig verwende, ist es einfach, mit dem Rückgabewert einer Funktion zu arbeiten, ohne eine neue Variable zu deklarieren, die das Funktionsergebnis enthält.
In PHP scheint dies jedoch nicht so einfach zu sein:
example1 (Funktionsergebnis ist ein Array)
<?php
function foobar(){
return preg_split('/\s+/', 'zero one two three four five');
}
// can php say "zero"?
/// print( foobar()[0] ); /// <-- nope
/// print( &foobar()[0] ); /// <-- nope
/// print( &foobar()->[0] ); /// <-- nope
/// print( "${foobar()}[0]" ); /// <-- nope
?>
example2 (Funktionsergebnis ist ein Objekt)
<?php
function zoobar(){
// NOTE: casting (object) Array() has other problems in PHP
// see e.g., http://stackoverflow.com/questions/1869812
$vout = (object) Array('0'=>'zero','fname'=>'homer','lname'=>'simpson',);
return $vout;
}
// can php say "zero"?
// print zoobar()->0; // <- nope (parse error)
// print zoobar()->{0}; // <- nope
// print zoobar()->{'0'}; // <- nope
// $vtemp = zoobar(); // does using a variable help?
// print $vtemp->{0}; // <- nope
PHP kann nicht auf Array-Ergebnisse einer Funktion zugreifen. Einige Leute nennen dies ein Problem, andere akzeptieren dies einfach als das Design der Sprache. PHP lässt Sie also unwesentliche Variablen erstellen, nur um die benötigten Daten zu extrahieren.
Sie müssen also tun.
$var = foobar();
print($var[0]);

smassey
Dies ist speziell die Dereferenzierung von Arrays, die derzeit in php5.3 nicht unterstützt wird, aber in der nächsten Version, 5.4, möglich sein sollte. Objekt-Dereferenzierung ist hingegen in aktuellen PHP-Releases möglich. Auf diese Funktion freue ich mich auch!

Gordon
Array-Dereferenzierung ist ab PHP 5.4 möglich:
function foo() {
return array(1, 2, 3);
}
echo foo()[2]; // prints 3
mit PHP5.3 du würdest bekommen
Error: Syntax Error, unerwartet '[', expecting ',' or ';'
Original Answer:
This has been been asked already before. The answer is no. It is not possible.
To quote Andi Gutmans on this topic:
This is a well known feature request
but won’t be supported in PHP 5.0. I
can’t tell you if it’ll ever be
supported. It requires some research
and a lot of thought.
You can also find this request a number of times in the PHP Bugtracker. For technical details, I suggest you check the official RFC and/or ask on PHP Internals.

Calvin
Well, you could use any of the following solutions, depending on the situation:
function foo() {
return array("foo","bar","foobar","barfoo","tofu");
}
echo(array_shift(foo())); // prints "foo"
echo(array_pop(foo())); // prints "tofu"
Or you can grab specific values from the returned array using list():
list($foo, $bar) = foo();
echo($foo); // prints "foo"
echo($bar); // print "bar"
Edit: the example code for each() I gave earlier was incorrect. each() returns a key-value pair. So it might be easier to use foreach():
foreach(foo() as $key=>$val) {
echo($val);
}

Tyler Carter
There isn’t a way to do that unfortunately, although it is in most other programming languages.
If you really wanted to do a one liner, you could make a function called a() and do something like
$test = a(func(), 1); // second parameter is the key.
But other than that, func()[1] wird in PHP nicht unterstützt.
Wie andere bereits erwähnt haben, ist dies nicht möglich. Die Syntax von PHP lässt dies nicht zu. Ich habe jedoch einen Vorschlag, der das Problem aus der anderen Richtung angreift.
Wenn Sie die Kontrolle haben getBarArray
-Methode verwenden und Zugriff auf die PHP-Standardbibliothek haben (auf vielen PHP 5.2.X-Hosts installiert und standardmäßig mit PHP 5.3 installiert), sollten Sie erwägen, eine zurückzugeben ArrayObject
anstelle eines nativen PHP-Arrays/einer nativen PHP-Sammlung. ArrayObjects
einen haben offetGet
-Methode, die verwendet werden kann, um jeden Index abzurufen, sodass Ihr Code in etwa so aussehen könnte
<?php
class Example {
function getBarArray() {
$array = new ArrayObject();
$array[] = 'uno';
$array->append('dos');
$array->append('tres');
return $array;
}
}
$foo = new Example();
$value = $foo->getBarArray()->offsetGet(2);
Und wenn Sie jemals ein natives Array/eine native Sammlung benötigen, können Sie die Ergebnisse jederzeit umwandeln.
//if you need
$array = (array) $foo->getBarArray();

Jason Planke
Schreiben Sie eine Wrapper-Funktion, die dasselbe erreicht. Aufgrund der einfachen Typumwandlung von PHP kann dies ziemlich offen sein:
function array_value ($array, $key) {
return $array[$key];
}
9892800cookie-checkPHP-Syntax zum Dereferenzieren des Funktionsergebnissesyes
Für Leser, die nicht zu den späteren Antworten scrollen, wurde PHP 5.4 (in Beta zum Zeitpunkt dieses Kommentars) eine Array-Dereferenzierung hinzugefügt …
– Michael Berkowski
13. Dezember 2011 um 21:59 Uhr
HINWEIS: Diese Frage wurde fälschlicherweise als Duplikat der Array-Dereferenzierung markiert. Diese Frage ist kein Duplikat, weil es nicht ausschließlich um Arrays geht. Eine PHP-Funktion kann jeden Werttyp zurückgeben, nicht nur Arrays (siehe Beispiel2 im Originalbeitrag, wo das Funktionsergebnis ein Objekt und kein Array ist).
– dreftymac
14. April 2015 um 15:33 Uhr
Für diejenigen, die sich nicht die Mühe machen können, alle Antworten durchzulesen, ist die “schönste” Lösung
call_user_func(function($a, $b){return $a[$b];}, $arr, $offset)
. Der Preis für den zweiten Platz geht ancurrent(array_slice($arr, $offset, 1))
.– Schrittmacher
20. Juli 2015 um 19:48 Uhr
@Pacerier nach welcher Metrik erklärst du einen für “schöner” als den anderen? Ist einer effizienter? Ehrlich gesagt ist die zweite Wahl schneller und einfacher zu schreiben.
– Kyle Farris
21. Juli 2015 um 20:31 Uhr