имеет ли php эквивалент синтаксиса понимания списков в python?

<p>у python есть синтаксически понятные списки:</p><pre><code>s = [x**2 for x in range(10)] print s; [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] </code></pre><p>в php мне нужно сделать цикл:</p><pre><code>$output = array(); $nums = range(0,9); foreach ($nums as $num) { $out[] = $num*=$num; } print_r($out); </code></pre><p>получить:</p><p>массив ([0] => 0 [1] => 1 [2] => 4 [3] => 9 [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 [9] => 81)</p><p>есть ли в любом случае получить подобный синтаксис понимания списка в php? есть ли возможность сделать это с помощью каких-либо новых функций в php 5.3?</p><p>спасибо!</p>

<p>может как то так?</p><pre><code>$out=array_map(function($x) {return $x$x;}, range(0, 9)) </code></pre><p>это будет работать в php 5.3+, в более старой версии вам придется определять обратный вызов для <a href="http://php.net/array\_map">array\_map</a> отдельно</p><pre><code>function sq($x) {return $x*$x;} $out=array\_map('sq', range(0, 9)); </code></pre>

<p>php 5.5 может поддерживать списки - смотрите объявление в списке рассылки:</p><ul> <li> <a href="http://markmail.org/thread/uvendztpe2rrwiif">[php-dev] список представлений и выражения генератора для php</a> (28 июня 2012 г.)</li> </ul><p>и дальнейшее обсуждение:</p><ul> <li> <a href="http://blog.ircmaxell.com/2012/07/what-generators-can-do-for-you.html">что генераторы могут сделать для вас</a> (от ircmaxell; 23 июля 2012 г.) - есть пример фибоначчи.</li> <li> <a href="http://nikic.github.com/2012/07/10/what-php-5-5-might-look-like.html#generators">как может выглядеть php 5.5</a> (by nikic; 10 июля 2012 г.)</li> <li> <a href="https://wiki.php.net/rfc/generators">запрос комментариев: генераторы</a> (wiki запущена 05 июня 2012 г.)</li> </ul>

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

<p>в .net эквивалентом "синтаксически понятного понимания списка" в python является linq. в php есть несколько портов, в том числе <a href="https://github.com/athari/yalinqo">yalinqo</a> библиотека *. синтаксически это ближе к sql, а не к последовательности традиционных конструкций с <code>for</code> и <code>if</code>, но функционально это похоже:</p><pre><code>$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; </code></pre><p>здесь <code>'$v  $v'</code> является ярлыком для <code>function ($v) { return $v * $v; }</code>, который поддерживает эта библиотека. к сожалению, php не поддерживает короткий синтаксис для замыканий, но такие "строковые лямбды" можно использовать для сокращения кода.</p><p>есть еще много методов, начиная с <code>where</code> (эквивалент <code>if</code>) и заканчивая <code>groupjoin</code>, который выполняет преобразование объединения с группировкой.</p><p><sub>* разработано мной</sub></p>