O PHP tem um equivalente à sintaxe de compreensão de lista do Python?
Pergunta
Python tem compreensões de lista sintaticamente agradáveis:
S = [x**2 for x in range(10)]
print S;
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Em PHP eu precisaria fazer alguns loops:
$output = array();
$Nums = range(0,9);
foreach ($Nums as $num)
{
$out[] = $num*=$num;
}
print_r($out);
obter:
Array ( [0] => 0 [1] => 1 [2] => 4 [3] => 9 [4] => 16 [5] => 25 [6] => 36 [7] => 49. [8] => 64. [9] => 81. )
Existe alguma maneira de obter uma sintaxe de compreensão de lista semelhante em PHP?Existe alguma maneira de fazer isso com algum dos novos recursos do PHP 5.3?
Obrigado!
Solução
Talvez algo assim?
$out=array_map(function($x) {return $x*$x;}, range(0, 9))
Isso funcionará no Php 5.3+, em uma versão mais antiga que você teria que definir o retorno de chamada para Array_map separadamente
function sq($x) {return $x*$x;}
$out=array_map('sq', range(0, 9));
Outras dicas
O PHP 5.5 pode suportar compreensões da lista - consulte o anúncio da lista de discussão:
- PHP-DEV] Compreensões e expressões de gerador para PHP (28 de junho de 2012)
E discussão adicional:
- O que os geradores podem fazer por você (por ircmaxell; 23 de julho de 2012) - tem um exemplo de Fibonacci.
- Como pode parecer o PHP 5.5 (por Nikic; 10 de julho de 2012)
- Solicitação de comentários: geradores (Wiki começou em 05 de junho de 2012)
Não está fora da caixa, mas dê uma olhada em:http://code.google.com/p/php-lc/ ou http://code.google.com/p/phparrayplus/
No .NET, o equivalente às "compreensões de lista sintaticamente agradáveis" do Python é LINQ.E no PHP, existem vários ports dele, incluindo YaLinqo biblioteca*.Sintaticamente, está mais próximo do SQL do que de uma sequência de construções tradicionais com for
e if
, mas funcionalmente é semelhante:
$a = Enumerable::range(0, 10)->select('$v * $v');
Isso produz um iterador que pode ser enviado para o console:
var_dump($a->toArray()); // by transforming the iterator to an array
echo $a->toString(', '); // or by imploding into a string
ou iterado usando foreach
:
foreach ($a as $i)
echo $i, PHP_EOL;
Aqui, '$v * $v'
é um atalho para function ($v) { return $v * $v; }
que esta biblioteca suporta.Infelizmente, o PHP não suporta sintaxe curta para encerramentos, mas essas "string lambdas" podem ser usadas para tornar o código mais curto.
Existem muitos outros métodos, começando com where
(if
equivalente) e terminando com groupJoin
que realiza transformação de junção com agrupamento.
*desenvolvido por mim