Entspricht PHP der Listenverständnis-Syntax von Python?

75

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!

Darren Newton
quelle
1
Ich würde sagen, ein noch besseres Beispiel dafür, wie großartig das Verständnis von Python-Listen ist, sind die Bedingungen! x = [x * 2 für x im Bereich (1,9), wenn x <3] oder was auch immer Wette, die mit Array-Map nicht möglich ist!
Jonathan
1
Siehe auch: Übergeben von Variablen an die anonyme Funktion stackoverflow.com/questions/11420520/…
dreftymac

Antworten:

86

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));
Paul Dixon
quelle
1
Gute Antwort. +1. Nicht gerade Listenverständnis, aber es ist trotzdem eine sehr elegante und kurze Lösung. Seien Sie vorsichtig, dies ist PHP 5.3+, da eine anonyme Funktion verwendet wird.
Lior Cohen
4
PHP 5.3 erforderlich. Aber schöne Lösung :)
Sebastian Hoitz
1
Zum Verständnis sind eine Bequemlichkeit über Karten-, Reduzierungs- und Filteroperationen. Für diese Angelegenheit zwischen array_map, array_reduce und array_filter könnten Sie alles haben, eine dünne Bibliothek, die die magische Methode _invoke () verwendet, und Sie könnten eine voll funktionsfähige _pretty- Funktions-API erhalten.
Saem
1
Können Sie dies mit einem Konstruktor verwenden? array_map("new MyClass", range(0,9))?
Thomas Ahle
1
Eigentlich ist das kein Listenverständnis. (Python hat auch mapFunktion.) Obwohl mapund Listenverständnis ähnlich sind.
schwächer
6

PHP 5.5 unterstützt möglicherweise das Listenverständnis - siehe Ankündigung der Mailingliste:

Und weitere Diskussion:

David Goodwin
quelle
5
Für diejenigen, die diesen Kommentar jetzt lesen: PHP 5.5 (oder 5.6) enthielt kein Listenverständnis. Es enthielt Generatoren.
Husky
Was ist mit PHP 7?
Jonathan
Entschuldigung, ich glaube nicht, dass PHP7 etwas zum Listenverständnis hinzugefügt hat.
David Goodwin
0

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 forund if, 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 mit groupJoindenen die Verbindungstransformation mit Gruppierung durchgeführt wird.

* von mir entwickelt

Athari
quelle