Pregunta

Python tiene listas por comprensión sintácticamente dulces:

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

En PHP que tendría que hacer algo de bucle:

$output = array();
$Nums = range(0,9);

foreach ($Nums as $num) 
{
    $out[] = $num*=$num;
}
print_r($out);

para obtener:

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

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

Gracias!

¿Fue útil?

Solución

Tal vez algo como esto?

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

Esto funciona en PHP 5.3+, en una versión más antigua que tendría que definir la devolución de llamada para array_map separado

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

Otros consejos

PHP 5.5 puede soportar listas por comprensión - ver el anuncio de la lista de correo:

Y más discusión:

En .NET, el equivalente a "listas por comprensión sintácticamente dulces" de Python es LINQ. Y en PHP, hay varios puertos de la misma, incluyendo YaLinqo biblioteca *. Sintácticamente, está más cerca de SQL en lugar 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 ser o bien de salida a 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;

A continuación, '$v * $v' es un atajo para function ($v) { return $v * $v; } que apoya esta biblioteca. Por desgracia, PHP no soporta la sintaxis corta para los cierres, pero tales "lambdas cadena" puede ser utilizado para hacer el código más corto.

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

* desarrollado por mí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top