Ha PHP hanno un equivalente alla lista la sintassi di comprensione di Python?
Domanda
Python ha list comprehension sintatticamente dolci:
S = [x**2 for x in range(10)]
print S;
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
In PHP avrei bisogno di fare un po 'looping:
$output = array();
$Nums = range(0,9);
foreach ($Nums as $num)
{
$out[] = $num*=$num;
}
print_r($out);
per ottenere:
Array ( [0] => 0 [1] => 1 [2] => 4 [3] => 9 [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 [9] => 81 )
Esiste un modo per ottenere un simile elenco di comprensione della sintassi in PHP? Esiste un modo per farlo con una delle nuove funzionalità di PHP 5.3?
Grazie!
Soluzione
Forse qualcosa di simile?
$out=array_map(function($x) {return $x*$x;}, range(0, 9))
Questo funziona in PHP 5.3+, in una versione precedente che avrebbe dovuto definire il callback per array_map separatamente
function sq($x) {return $x*$x;}
$out=array_map('sq', range(0, 9));
Altri suggerimenti
PHP 5.5 può sostenere list comprehension - vedere la lista di annuncio:
E ulteriori discussioni:
- Cosa generatori possono fare per voi (da ircmaxell; 23 luglio 2012) -. ha un esempio di Fibonacci
- Cosa PHP 5.5 potrebbe essere simile (da Nikic, 10 lug 2012)
- Request for Comments: Generatori (Wiki iniziato 5 Giugno 2012)
Non fuori dalla scatola, ma dare un'occhiata a: http://code.google.com/p/php-lc/ o http://code.google.com/p/phparrayplus/
In .NET, l'equivalente di "list comprehension sintatticamente dolci" di Python è LINQ. E in PHP, ci sei diversi porti di esso, tra cui YaLinqo biblioteca *. Sintatticamente, è più vicino a SQL piuttosto che una sequenza di costrutti tradizionali con for
e if
, ma funzionalmente, è simile:
$a = Enumerable::range(0, 10)->select('$v * $v');
Questo produce un iteratore che può essere sia output console:
var_dump($a->toArray()); // by transforming the iterator to an array
echo $a->toString(', '); // or by imploding into a string
o iterata con foreach
:
foreach ($a as $i)
echo $i, PHP_EOL;
Qui, '$v * $v'
è una scorciatoia per function ($v) { return $v * $v; }
che supporta questa libreria. Purtroppo, PHP non supporta la sintassi breve per le chiusure, ma tali "lambda stringa" può essere utilizzato per rendere il codice più breve.
Ci sono molti altri metodi, a partire da where
(if
equivalente) e termina con groupJoin
che svolge unirsi trasformazione con il raggruppamento.
* sviluppato da me