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 einige Schleifen 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 überhaupt eine ähnliche Listenverständnis-Syntax in PHP? Gibt es überhaupt eine Möglichkeit, dies mit einer der neuen Funktionen in PHP 5.3 zu tun?
Vielen Dank!
php
arrays
list-comprehension
higher-order-functions
language-comparisons
Darren Newton
quelle
quelle
Antworten:
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 für array_map separat definieren
function sq($x) {return $x*$x;} $out=array_map('sq', range(0, 9));
quelle
array_map("new MyClass", range(0,9))
?map
Funktion.) Obwohlmap
und Listenverständnis ähnlich sind.PHP 5.5 unterstützt möglicherweise das Listenverständnis - siehe Ankündigung der Mailingliste:
Und weitere Diskussion:
quelle
Nicht sofort einsatzbereit , aber sehen Sie sich Folgendes an: http://code.google.com/p/php-lc/ oder http://code.google.com/p/phparrayplus/
quelle
In .NET ist das Äquivalent zu Pythons "syntaktisch süßem Listenverständnis" LINQ. Und in PHP gibt es mehrere Ports, einschließlich der YaLinqo- Bibliothek *. Syntaktisch ist es näher an SQL als an einer Folge traditioneller Konstrukte mit
for
undif
, aber funktional 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 mit
foreach
:foreach ($a as $i) echo $i, PHP_EOL;
Hier
'$v * $v'
ist eine Verknüpfung,function ($v) { return $v * $v; }
die diese Bibliothek unterstützt. Leider unterstützt PHP keine kurze Syntax für Schließungen, aber solche "String-Lambdas" können verwendet werden, um den Code kürzer zu machen.Es gibt viele weitere Methoden, beginnend mit
where
(if
äquivalent) und endend mitgroupJoin
denen die Verbindungstransformation mit Gruppierung durchgeführt wird.* von mir entwickelt
quelle