59

Python ha list sintatticamente dolci comprehension:PHP ha un equivalente alla sintassi di comprensione degli elenchi di Python?

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? C'è comunque modo di farlo con una delle nuove funzionalità di PHP 5.3?

Grazie!

+1

direi una ancora migliore esempio di come impressionante pitone list comprehension sono sono i condizionali! x = [x * 2 per x nella gamma (1,9) se x <3] o qualunque scommessa che non può essere fatto con la mappa serie! –

risposta

71

Forse qualcosa del genere?

$out=array_map(function($x) {return $x*$x;}, range(0, 9)) 

Ciò funzionerà 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)); 
+1

Bella risposta. +1. Non esattamente la comprensione delle liste, ma è comunque una soluzione molto elegante e breve. Attenzione, questo è PHP 5.3+ poiché viene utilizzata una funzione anonima. –

+4

PHP 5.3 richiesto. Ma bella soluzione :) –

+0

create_function() potrebbe probabilmente essere utilizzato con PHP <5.3 –

4

PHP 5.5 può sostenere list comprehension - vedere la mailing list di annuncio:

E ulteriori discussioni:

+5

Per coloro che leggono questo commento ora: PHP 5.5 (o 5.6) non ha incluso list comprehension. Comprendeva i generatori. – Husky

+0

Che dire di PHP 7? –

+0

Mi spiace, non penso che PHP7 abbia aggiunto nulla per quanto riguarda la comprensione delle liste. –

0

In .NET, l'equivalente di "list comprehension sintatticamente dolci" di Python è LINQ. E in PHP ci sono diverse porte, inclusa la libreria YaLinqo *.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 uscita console:

var_dump($a->toArray()); // by transforming the iterator to an array 
echo $a->toString(', '); // or by imploding into a string 

o ripetuti su utilizzando foreach:

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

Qui, '$v * $v' è una scorciatoia per function ($v) { return $v * $v; } supportata da questa libreria. Sfortunatamente, PHP non supporta la sintassi breve per le chiusure, ma tali "string lambda" possono essere utilizzate per rendere il codice più breve.

Esistono molti altri metodi, a partire da where (if equivalenti) e termina con groupJoin che esegue l'unione della trasformazione con il raggruppamento.

* sviluppato da me

Problemi correlati