Имеет ли 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?
Спасибо!
Ответы
Ответ 1
Может быть, что-то вроде этого?
$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));
Ответ 2
PHP 5.5 может поддерживать понимание списка - см. объявление списка рассылки:
И дальнейшее обсуждение:
Ответ 3
не из коробки, но посмотрите:
http://code.google.com/p/php-lc/ или http://code.google.com/p/phparrayplus/
Ответ 4
В .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 не поддерживает короткий синтаксис для закрытий, но такие "строковые lambdas" могут использоваться, чтобы сделать код короче.
Существует еще много методов, начиная с where
(if
) и заканчивая groupJoin
, который выполняет объединение преобразования с группировкой.
*, разработанный мной