59

Python tiene lista sintácticamente dulces comprensiones:¿Tiene PHP un equivalente a la sintaxis de comprensión de la lista de Python?

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:

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 conseguir una sintaxis comprensión lista similar en PHP? ¿Hay alguna forma de hacerlo con alguna de las nuevas características en PHP 5.3?

Gracias!

+1

yo diría que incluso un mejor ejemplo de cómo pitón impresionante listas por comprensión son los condicionales es! x = [x * 2 para x en el rango (1,9) si x <3] o lo que sea ¡Apuesta que no se puede hacer con el mapa de la matriz! –

Respuesta

71

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 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)); 
+1

Buena respuesta. +1. No es exactamente una lista de comprensión, pero es una solución muy elegante y corta, sin embargo. Tenga cuidado, esto es PHP 5.3+ ya que se usa una función anónima. –

+4

Requiere PHP 5.3. Pero buena solución :) –

+0

create_function() probablemente podría utilizarse con PHP <5.3 –

4

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

Y más discusión:

+5

Para aquellos que lean este comentario ahora: PHP 5.5 (o 5.6) no incluyó la lista de comprensiones. Incluyó generadores. – Husky

+0

¿Qué hay de PHP 7? –

+0

Lo siento, no creo que PHP7 haya agregado nada sobre las listas de comprensión. –

0

En .NET, el equivalente a "listas por comprensión 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 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 repiten a lo largo usando foreach:

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

Aquí, es '$v * $v' un atajo para 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í

Cuestiones relacionadas