Есть ли у 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?
Спасибо!
Решение
Может быть, что -то подобное?
$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));
Другие советы
PHP 5.5 может поддержать понимание списка - см. Объявление списка рассылки:
- PHP-DEV] Список понимания и выражения генератора для PHP (28 июня 2012 г.)
И дальнейшее обсуждение:
- Что генераторы могут сделать для вас (от ircmaxell; 23 июля 2012 г.) - имеет пример Fibonacci.
- Как может выглядеть PHP 5.5 (Nikic; 10 июля 2012 г.)
- Запрос на комментарии: генераторы (Вики началась 05 июня 2012 г.)
Не из коробки, но взгляните на:http://code.google.com/p/php-lc/ или же http://code.google.com/p/phparrayplus/
В .NET эквивалентом «Синтаксически сладкого понимания Python является LINQ. И в PHP есть несколько портов, включая Ялинко библиотека*. Синтаксически, он ближе к 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
который выполняет объединение трансформации с группировкой.
* Разработано мной