59

Python a la liste syntaxiquement doux compréhensions:PHP a-t-il un équivalent à la syntaxe de compréhension de liste de Python?

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:

Tableau ( [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 à le faire avec l'une des nouvelles fonctionnalités de PHP 5.3?

Merci!

+1

Je dirais un meilleur exemple de la façon dont la liste python compréhensions sont génial est le conditionals! x = [x * 2 pour x dans la plage (1,9) si x <3] ou autre Pari que ne peut pas être fait avec la carte de tableau! –

Répondre

71

Peut-être que 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)); 
+1

Bonne réponse. +1 Pas exactement la compréhension de la liste, mais c'est quand même une solution très élégante et courte. Attention, c'est PHP 5.3+ puisqu'une fonction anonyme est utilisée. –

+4

PHP 5.3 requis. Mais belle solution :) –

+0

create_function() pourrait probablement être utilisé avec PHP <5.3 –

4

PHP 5.5 peut prendre en charge la liste compréhensions - voir l'annonce de la liste de diffusion:

Et discussion plus:

+5

Pour ceux qui lisent ce commentaire maintenant: PHP 5.5 (ou 5.6) n'incluait pas les compréhensions de liste. Cela comprenait des générateurs. – Husky

+0

Qu'en est-il de PHP 7? –

+0

Désolé, je ne pense pas que PHP7 ait ajouté quoi que ce soit concernant la compréhension des listes. –

0

Dans .NET, l'équivalent de "liste syntaxiquement doux compréhensions" Python est LINQ. Et en PHP, il y a plusieurs ports, 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'); 

Ce produit un itérateur 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; } que cette bibliothèque prend en charge. Malheureusement, PHP ne supporte pas la syntaxe courte pour les fermetures, mais une telle "chaîne de caractères" peut être utilisée pour raccourcir le code.

Il existe beaucoup d'autres méthodes, commençant par where (if équivalent) et se terminant par groupJoin qui effectue la jointure de la transformation avec le groupement.

* développé par moi

Questions connexes