Est-ce que PHP ont un équivalent à la syntaxe de la compréhension de la liste de Python?
Question
Python a la liste syntaxiquement doux compréhensions:
S = [x**2 for x in range(10)]
print S;
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
En PHP je besoin de faire quelques looping:
$output = array();
$Nums = range(0,9);
foreach ($Nums as $num)
{
$out[] = $num*=$num;
}
print_r($out);
pour obtenir:
array ( [0] => 0 [1] => 1 [2] => 4 [3] => 9 [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 [9] => 81 )
Y at-il de toute façon à obtenir une syntaxe de compréhension de liste similaire en PHP? Y at-il de toute façon de le faire avec l'une des nouvelles fonctionnalités de PHP 5.3?
Merci!
La solution
Peut-être quelque chose comme ça?
$out=array_map(function($x) {return $x*$x;}, range(0, 9))
Cela fonctionne en PHP 5.3+, dans une version plus ancienne que vous auriez à définir la fonction de rappel pour array_map séparément
function sq($x) {return $x*$x;}
$out=array_map('sq', range(0, 9));
Autres conseils
PHP 5.5 peut prendre en charge la liste compréhensions - voir l'annonce de la liste de diffusion:
Et la discussion plus:
- Qu'est-ce que générateurs peuvent faire pour vous (par ircmaxell, 23 mars 2012) -. a un exemple de Fibonacci
- Qu'est-ce que PHP 5.5 pourrait ressembler à (par Nikić, 10 mars 2012)
- Demande de commentaires: des générateurs (Wiki a commencé le 5 juin 2012)
pas de la boîte, mais jetez un oeil à: http://code.google.com/p/php-lc/ ou http://code.google.com/p/phparrayplus/
Dans .NET, l'équivalent de « liste syntaxiquement doux compréhensions » Python est LINQ. Et en PHP, il sont plusieurs ports de celui-ci, y compris la bibliothèque YaLinqo *. Syntaxiquement, il est plus proche de SQL plutôt que d'une séquence de constructions traditionnelles avec for
et if
, mais fonctionnellement, il est similaire:
$a = Enumerable::range(0, 10)->select('$v * $v');
Ceci produit un iterator qui peut être soit sortie à la console:
var_dump($a->toArray()); // by transforming the iterator to an array
echo $a->toString(', '); // or by imploding into a string
ou itéré en utilisant foreach
:
foreach ($a as $i)
echo $i, PHP_EOL;
Ici, '$v * $v'
est un raccourci pour function ($v) { return $v * $v; }
qui cette bibliothèque prend en charge. Malheureusement, PHP ne supporte pas la syntaxe courte pour les fermetures, mais ces « lambdas de chaîne » peut être utilisé pour rendre le code plus court.
Il sont beaucoup plus méthodes, en commençant par where
(if
équivalent) et se terminant par groupJoin
qui effectue la transformation avec jonction groupement.
* développé par moi