una tuplas recorrer por llenar listas lista funciones comprimidas comprensión comprension anidadas php arrays list-comprehension higher-order-functions language-comparisons

tuplas - ¿PHP tiene un equivalente a la sintaxis de comprensión de la lista de Python?



llenar una lista en python (4)

En .NET, el equivalente de las "comprensiones de listas sintácticamente dulces" de Python es LINQ. Y en PHP, hay varios puertos, incluida la biblioteca YaLinqo *. Sintácticamente, está más cerca de SQL que de una secuencia de construcciones tradicionales con for y if , pero funcionalmente es similar:

$a = Enumerable::range(0, 10)->select(''$v * $v'');

Esto produce un iterador que puede enviarse a la consola:

var_dump($a->toArray()); // by transforming the iterator to an array echo $a->toString('', ''); // or by imploding into a string

o iterado sobre el uso de foreach :

foreach ($a as $i) echo $i, PHP_EOL;

Aquí, ''$v * $v'' es un atajo para la function ($v) { return $v * $v; } function ($v) { return $v * $v; } que esta biblioteca admite. Desafortunadamente, PHP no admite la sintaxis corta para cierres, pero tales "lambdas de cadena" se pueden usar para acortar el código.

Hay muchos más métodos, comenzando con where ( if equivalente) y terminando con groupJoin que realiza la unión de la transformación con la agrupación.

* desarrollado por mí

Python tiene comprensión de lista sintácticamente dulce:

S = [x**2 for x in range(10)] print S; [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

En PHP, necesitaría hacer algunos bucles:

$output = array(); $Nums = range(0,9); foreach ($Nums as $num) { $out[] = $num*=$num; } print_r($out);

Llegar:

Matriz ([0] => 0 [1] => 1 [2] => 4 [3] => 9 [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 [9] => 81)

¿Hay alguna forma de obtener una lista similar de sintaxis de comprensión en PHP? ¿Hay alguna forma de hacerlo con alguna de las nuevas características en PHP 5.3?

¡Gracias!



Tal vez algo como esto?

$out=array_map(function($x) {return $x*$x;}, range(0, 9))

Esto funcionará en PHP 5.3+, en una versión anterior deberías definir la devolución de llamada para array_map por separado

function sq($x) {return $x*$x;} $out=array_map(''sq'', range(0, 9));