Вопрос

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 может поддержать понимание списка - см. Объявление списка рассылки:

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

Не из коробки, но взгляните на: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 который выполняет объединение трансформации с группировкой.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top