PHP no tiene un equivalente a la sintaxis de lista por comprensión de Python?
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!
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:
- Lo que los generadores pueden hacer por usted (por ircmaxell 23; jul 2012) -. tiene un ejemplo Fibonacci
- Lo PHP 5.5 podría parecerse (por Nikić, 10 jul 2012)
- Petición de Comentarios: Generadores (Wiki comenzó 05 jun 2012)
No fuera de la caja, pero echa un vistazo a: http://code.google.com/p/php-lc/ o http://code.google.com/p/phparrayplus/
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í