Intereting Posts

Имеет ли 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 г.) – есть пример Фибоначчи.
  • Что может выглядеть PHP 5.5 (от NikiC, 10 июля 2012 г.)
  • Запрос комментариев: Генераторы (Wiki начато 05 июня 2012 г.)

не из коробки, но посмотрите: http://code.google.com/p/php-lc/ или http://code.google.com/p/phparrayplus/.

В .NET эквивалент Python «синтаксически сладких списков» – LINQ. И в PHP есть несколько его портов, включая библиотеку YaLinqo *. Синтаксически это ближе к SQL, а не к последовательности традиционных конструкций с if и 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; } function ($v) { return $v * $v; } который поддерживает эта библиотека. К сожалению, PHP не поддерживает короткий синтаксис для замыканий, но такие «струнные лямбды» могут быть использованы для сокращения кода.

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

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