Hat PHP ein Äquivalent zu Pythons List -Verständnis -Syntax?
Frage
Python hat syntaktisch süße Listenverständnisse:
S = [x**2 for x in range(10)]
print S;
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
In PHP müsste ich etwas Looping machen:
$output = array();
$Nums = range(0,9);
foreach ($Nums as $num)
{
$out[] = $num*=$num;
}
print_r($out);
bekommen:
Array ([0] => 0 [1] => 1 [2] => 4 [3] => 9 [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 [9] => 81)
Gibt es sowieso eine ähnliche Listenverständnissyntax in PHP? Gibt es trotzdem mit einer der neuen Funktionen in PHP 5.3?
Vielen Dank!
Lösung
Vielleicht so etwas?
$out=array_map(function($x) {return $x*$x;}, range(0, 9))
Dies funktioniert in PHP 5.3+, in einer älteren Version müssten Sie den Rückruf definieren Array_Map separat
function sq($x) {return $x*$x;}
$out=array_map('sq', range(0, 9));
Andere Tipps
PHP 5.5 kann die Liste der Liste unterstützen - Siehe Ankündigung der Mailingliste:
Und weitere Diskussion:
- Was Generatoren für Sie tun können (von ircmaxell; 23. Juli 2012) - hat ein Fibonacci -Beispiel.
- Wie PHP 5.5 aussehen könnte (von Nikic; 10. Juli 2012)
- Anfrage nach Kommentaren: Generatoren (Wiki begann den 05. Juni 2012)
Nicht aus der Schachtel, sondern schauen Sie sich an:http://code.google.com/p/php-lc/ oder http://code.google.com/p/phparrayplus/
In .NET ist das Äquivalent von Pythons "Syntaktisch süßen Listenverständnis" linq. Und in PHP gibt es mehrere Häfen davon, einschließlich Yalinqo Bibliothek*. Syntaktisch ist es eher SQL als einer Abfolge traditioneller Konstrukte mit for
und if
, aber funktionell ist es ähnlich:
$a = Enumerable::range(0, 10)->select('$v * $v');
Dies erzeugt einen Iterator, der entweder an die Konsole ausgegeben werden kann:
var_dump($a->toArray()); // by transforming the iterator to an array
echo $a->toString(', '); // or by imploding into a string
oder iteriert über die Verwendung foreach
:
foreach ($a as $i)
echo $i, PHP_EOL;
Hier, '$v * $v'
ist eine Abkürzung für function ($v) { return $v * $v; }
was diese Bibliothek unterstützt. Leider unterstützt PHP keine kurze Syntax für Verschluss, aber solche "String -Lambdas" können verwendet werden, um den Code kürzer zu machen.
Es gibt noch viele weitere Methoden, beginnend mit where
(if
äquivalent) und enden mit groupJoin
die mit der Gruppierung verbundene Transformation durchführt.
* Von mir entwickelt