Вопрос по php, language-comparisons, higher-order-functions, list-comprehension, arrays – Есть ли у PHP эквивалент синтаксиса понимания списка в Python?

65

У 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);

получить:

Array ( [0] => 0 [1] => 1 [2] => 4 [3] => 9 [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 [9] => 81 )

Есть ли в любом случае получить подобный синтаксис понимания списка в PHP? Есть ли способ сделать это с помощью каких-либо новых функций в PHP 5.3?

Спасибо!

See also: передача переменных в анонимную функциюstackoverflow.com/questions/11420520/… dreftymac
Я бы сказал, что еще лучший пример того, насколько потрясающими являются списки Python, - это условные выражения! x = [x * 2 для x в диапазоне (1,9), если x & lt; 3] или любой другой ставки, которую нельзя сделать с помощью карты массива! Jonathan

Ваш Ответ

4   ответа
2

не из коробки, но взгляните на: http://code.google.com/p/php-lc/ или жеhttp://code.google.com/p/phparrayplus/

75

Может как то так?

$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));
На самом деле это не понимание списка. (Python имеетmap функция тоже.) Хотяmap и список понимания похожи.
Требуется PHP 5.3. Но хорошее решение :)
Можете ли вы использовать это с конструктором?array_map("new MyClass", range(0,9))?
Хороший ответ. +1. Не совсем точное понимание списка, но, тем не менее, это очень элегантное и короткое решение. Будьте осторожны, это PHP 5.3+, так как используется анонимная функция.
Для понимания удобны операции с картой, сокращением и фильтрацией. В этом отношении между array_map, array_reduce и array_filter у вас может быть все, тонкая библиотека, использующая_invoke() magic method and you could get a full on _pretty функциональный API.
0

В .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 не поддерживает короткий синтаксис для замыканий, но такие «строковые лямбды» может быть использован для сокращения кода.

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

* developed by me

5

PHP 5.5 может поддерживать списки - смотрите объявление в списке рассылки:

[PHP-DEV] List comprehensions and generator expressions for PHP (28 Jun 2012)

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

What Generators Can Do For You (by ircmaxell; 23 Jul 2012) - has a Fibonacci example. What PHP 5.5 might look like (by NikiC; 10 Jul 2012) Request for Comments: Generators (Wiki started 05 Jun 2012)
Для тех, кто читает этот комментарий сейчас: PHP 5.5 (или 5.6) не содержит списочных представлений. Это включало генераторы.
Как насчет PHP 7?
Извините, я не думаю, что PHP7 добавил что-либо, касающееся понимания списков.

Похожие вопросы