it-swarm.com.ru

Имеет ли PHP эквивалент синтаксиса понимания списков в Python?

У Python есть синтаксически понятные списки:

S = [x**2 for x in range(10)]
print S;
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

В PHP мне нужно сделать цикл:

$output = array();
$Nums = range(0,9);

foreach ($Nums as $num) 
{
    $out[] = $num*=$num;
}
print_r($out);

получить:

Массив ([0] => 0 [1] => 1 [2] => 4 [3] => 9 [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 [9] => 81)

Есть ли в любом случае получить подобный синтаксис понимания списка в PHP? Есть ли возможность сделать это с помощью каких-либо новых функций в PHP 5.3?

Спасибо!

67
Darren Newton

Может как то так?

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

Это будет работать в PHP 5.3+, в более старой версии вам придется определять обратный вызов для array_map отдельно

function sq($x) {return $x*$x;}
$out=array_map('sq', range(0, 9));
75
Paul Dixon

PHP 5.5 может поддерживать списки - смотрите объявление в списке рассылки:

И дальнейшее обсуждение:

5
David Goodwin

не из коробки, но взгляните на: http://code.google.com/p/php-lc/ или http://code.google.com/ р/phparrayplus /

2
Rufinus

В .NET эквивалентом "синтаксически понятного понимания списка" в Python является LINQ. В PHP есть несколько портов, в том числе YaLinqo библиотека *. Синтаксически это ближе к SQL, а не к последовательности традиционных конструкций с for и if, но функционально это похоже:

$a = Enumerable::range(0, 10)->select('$v * $v');

Это создает итератор, который может быть выведен на консоль:

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

или перебрать с помощью foreach:

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

Здесь '$v * $v' является ярлыком для function ($v) { return $v * $v; }, который поддерживает эта библиотека. К сожалению, PHP не поддерживает короткий синтаксис для замыканий, но такие "строковые лямбды" можно использовать для сокращения кода.

Есть еще много методов, начиная с where (эквивалент if) и заканчивая groupJoin, который выполняет преобразование объединения с группировкой.

* разработано мной

0
Athari