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!

Foi útil?

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:

E discussão adicional:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top