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!

War es hilfreich?

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:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top