59

Python có comprehensions danh sách cú pháp ngọt ngào:PHP có tương đương với cú pháp đọc danh sách của Python không?

S = [x**2 for x in range(10)] 
print S; 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

Trong PHP tôi sẽ cần phải làm một số vòng lặp:

$output = array(); 
$Nums = range(0,9); 

foreach ($Nums as $num) 
{ 
    $out[] = $num*=$num; 
} 
print_r($out); 

để có được:

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

Liệu có cách nào để có được một cú pháp hiểu danh sách tương tự trong PHP? Có anyway để làm điều đó với bất kỳ tính năng mới trong PHP 5.3?

Cảm ơn!

+1

Tôi muốn nói một ví dụ thậm chí tốt hơn về cách tuyệt vời python danh sách comprehensions đang là điều kiện! x = [x * 2 cho x trong phạm vi (1,9) nếu x <3] hoặc bất kỳ số nào Đặt cược không thể thực hiện được với bản đồ mảng! –

Trả lời

71

Có thể giống như thế này?

$out=array_map(function($x) {return $x*$x;}, range(0, 9)) 

này sẽ làm việc trong PHP 5.3+, trong một phiên bản cũ hơn, bạn sẽ phải xác định gọi lại cho array_map riêng

function sq($x) {return $x*$x;} 
$out=array_map('sq', range(0, 9)); 
+1

Câu trả lời hay. +1. Không chính xác danh sách hiểu, nhưng nó là một giải pháp rất thanh lịch và ngắn tuy nhiên. Có một tho chăm sóc, đây là PHP 5.3+ vì một hàm ẩn danh được sử dụng. Yêu cầu phải có –

+4

PHP 5.3. Nhưng giải pháp tốt đẹp :) –

+0

create_function() có thể có thể được sử dụng với PHP <5.3 –

4

PHP 5,5 có thể hỗ trợ comprehensions danh sách - xem thông báo danh sách gửi thư:

Và thảo luận thêm:

+5

Đối với những người đọc nhận xét này ngay bây giờ: PHP 5.5 (hoặc 5.6) không bao gồm tính năng hiểu danh sách. Nó bao gồm máy phát điện. – Husky

+0

Còn PHP 7 thì sao? –

+0

Xin lỗi, tôi không nghĩ rằng PHP7 đã thêm bất cứ điều gì liên quan đến việc hiểu danh sách. –

0

Trong .NET, tương đương với "comprehensions danh sách cú pháp ngọt ngào" Python là LINQ. Và trong PHP, có một số cổng của nó, bao gồm thư viện YaLinqo *.Cú pháp, nó gần gũi hơn với SQL chứ không phải là một chuỗi các cấu trúc truyền thống với forif, nhưng về mặt chức năng, nó tương tự như:

$a = Enumerable::range(0, 10)->select('$v * $v'); 

Điều này tạo ra một iterator mà có thể là đầu ra để an ủi:

var_dump($a->toArray()); // by transforming the iterator to an array 
echo $a->toString(', '); // or by imploding into a string 

hoặc được lặp lại qua việc sử dụng foreach:

foreach ($a as $i) 
    echo $i, PHP_EOL; 

Ở đây, '$v * $v' là một lối tắt cho function ($v) { return $v * $v; } thư viện này hỗ trợ. Thật không may, PHP không hỗ trợ cú pháp ngắn cho các bao đóng, nhưng "chuỗi lambdas" như vậy có thể được sử dụng để làm cho mã ngắn hơn.

Có nhiều phương pháp khác, bắt đầu bằng where (if tương đương) và kết thúc bằng groupJoin thực hiện kết hợp chuyển đổi với nhóm.

* phát triển bởi tôi

Các vấn đề liên quan