Чи має PHP еквівалент синтаксису розуміння списку Python?


76

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
Я б сказав, що ще кращим прикладом того, наскільки чудовими є розуміння списку пітонів, є умови! x = [x * 2 для x в діапазоні (1,9), якщо x <3], або будь-яка інша ставка, яку неможливо зробити з картою масиву!
Джонатан

1
Дивіться також: Передача змінних в анонімну функцію stackoverflow.com/questions/11420520 / ...
dreftymac

Відповіді:


87

Може щось подібне?

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

1
Приємна відповідь. +1. Не зовсім розуміння списку, але це дуже елегантне та коротке рішення, тим не менше. Будьте обережні, це PHP 5.3+, оскільки використовується анонімна функція.
Ліор Коен,

4
Потрібен PHP 5.3. Але гарне рішення :)
Себастьян Хойц

1
Для розуміння це зручність перед картою, зменшенням та операціями фільтрування. Якщо говорити про array_map, array_reduce та array_filter, у вас може бути все, тонка бібліотека з використанням магічного методу _invoke (), і ви можете отримати повний функціональний API _pretty .
Саєм

1
Чи можете ви використовувати це з конструктором A? array_map("new MyClass", range(0,9))?
Thomas Ahle

1
Насправді це не розуміння списку. (Python mapтеж має функцію.) Хоча mapрозуміння списку і схоже.
слабкий

6

PHP 5.5 може підтримувати розуміння списку - див. Оголошення про розсилку:

І подальше обговорення:


5
Для тих, хто зараз читає цей коментар: PHP 5.5 (або 5.6) не включав розуміння списку. Він включав генератори.
Husky

А як щодо PHP 7?
Джонатан

На жаль, я не думаю, що PHP7 додав щось щодо розуміння списку.
Девід Гудвін,


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яким виконує перетворення об’єднання з групуванням.

* розроблений мною

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.