2008-08-16 32 views
47

Trong php, tôi thường cần ánh xạ một biến bằng cách sử dụng một mảng ... nhưng tôi dường như không thể làm điều này trong một lớp lót. c.f. Ví dụ:PHP: Access Array Value on the Fly

// the following results in an error: 
echo array('a','b','c')[$key]; 

// this works, using an unnecessary variable: 
$variable = array('a','b','c'); 
echo $variable[$key]; 

Đây là một vấn đề nhỏ, nhưng nó giữ bugging mỗi một lần trong một thời gian ... Tôi không thích thực tế, mà tôi sử dụng một biến cho không có gì;)

+4

trình như của 'PHP v5.4', cú pháp bất hợp pháp trong' PHP <= v5.3' –

Trả lời

15

tôi wouldn 't bận tâm về biến thêm đó, thực sự. Nếu bạn muốn, tuy nhiên, bạn cũng có thể loại bỏ nó khỏi bộ nhớ sau khi bạn đã sử dụng nó:

$variable = array('a','b','c'); 
echo $variable[$key]; 
unset($variable); 

Hoặc, bạn có thể viết một hàm nhỏ:

function indexonce(&$ar, $index) { 
    return $ar[$index]; 
} 

và gọi này với:

$something = indexonce(array('a', 'b', 'c'), 2); 

Mảng này sẽ tự động bị hủy ngay bây giờ.

+0

@onnodb, 'tiêu chuẩn nghiêm ngặt: Chỉ có biến nên được thông qua bởi reference' cho chức năng của bạn 'indexonce'. Tại sao bạn thêm tham chiếu '&'? – Pacerier

38

Câu trả lời kỹ thuật là Grammar của ngôn ngữ PHP chỉ cho phép ký hiệu subscript trên cuối biểu thức biến và không biểu nói chung, đó là cách nó hoạt động trong hầu hết các ngôn ngữ khác. Tôi đã luôn coi nó như là một sự thiếu hụt trong ngôn ngữ, bởi vì nó có thể có một ngữ pháp giải quyết các bảng con chống lại bất kỳ biểu hiện rõ ràng. Tuy nhiên, có thể là trường hợp họ đang sử dụng một trình tạo phân tích cú pháp không linh hoạt hoặc đơn giản là họ không muốn phá vỡ một số khả năng tương thích ngược.

Dưới đây là một vài chi tiết ví dụ về các kí hiệu không hợp lệ trên biểu thức hợp lệ:

$x = array(1,2,3); 
print ($x)[1]; //illegal, on a parenthetical expression, not a variable exp. 

function ret($foo) { return $foo; } 
echo ret($x)[1]; // illegal, on a call expression, not a variable exp. 
+2

Có một đề nghị thay đổi ít nhất cho cú pháp thứ hai, nhưng nó đã bị từ chối: http://wiki.php.net/rfc/functionarraydereferencing – Max

+11

Hiện trạng đã được thay đổi thành http://wiki.php.net/rfc/ functionarraydereferencing –

+3

Câu trả lời này không còn chính xác nữa. Tính đến 5,5, PHP hỗ trợ hằng số/mảng/chuỗi dereference https://wiki.php.net/rfc/constdereference – Mbrevda

0

Hoặc một cái gì đó như thế này, nếu bạn cần các giá trị mảng trong một biến

$variable = array('a','b','c'); 
$variable = $variable[$key]; 
1

trên thực tế, có một giải pháp thanh lịch :) Phần sau sẽ chỉ định phần tử thứ 3 của mảng được myfunc trả về $ myvar:

$myvar = array_shift(array_splice(myfunc(),2)); 
+8

Thông minh? Vâng! Thanh lịch? Không. –

2
function doSomething() 
{ 
    return $somearray; 
} 

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject(); 
+0

Làm thế nào bạn có thể làm 'get (1)' trên một mảng? Lỗi nghiêm trọng: Gọi hàm thành viên get() trên một đối tượng không trong tệp.php trên dòng 21 – Pacerier

5

này có thể không được liên quan trực tiếp .. Nhưng tôi đã đến bài đăng này tìm giải pháp cho vấn đề cụ thể này.

Tôi nhận được kết quả từ một hàm trong biểu mẫu sau.

Array 
(
    [School] => Array 
      (
       [parent_id] => 9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a 
      ) 
) 

điều tôi muốn là giá trị parent_id "9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a". Tôi đã sử dụng chức năng như thế này và nhận được nó.

array_pop(array_pop(the_function_which_returned_the_above_array())) 

Vì vậy, nó được thực hiện trong một dòng :) Hy vọng Sẽ hữu ích cho ai đó.

+0

Điều này chỉ hoạt động trên giá trị cuối cùng và bạn sẽ xóa giá trị khỏi mảng ** ban đầu. – Pacerier

0

Có một số oneliners bạn có thể đưa ra, sử dụng hàm php mảng_ *. Nhưng tôi đảm bảo với bạn rằng làm như vậy nó là tổng dư thừa so sánh những gì bạn muốn đạt được.

Ví dụ bạn có thể sử dụng một cái gì đó như sau, nhưng nó không phải là một giải pháp thanh lịch và tôi không chắc chắn về hiệu suất của việc này;

array_pop (array_filter(array_returning_func(), function($key){ return $key=="array_index_you_want"? TRUE:FALSE; },ARRAY_FILTER_USE_KEY)); 

nếu bạn đang sử dụng khung php và bạn đang mắc kẹt với phiên bản cũ hơn của php, hầu hết các khuôn khổ đều có thư viện trợ giúp.

dụ: CodeIgniter giúp đỡ mảng

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