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!

È stato utile?

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:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top