2010-03-23 6 views
7

Trong php làm cách nào tôi có thể truy cập vào các giá trị của mảng mà không sử dụng dấu ngoặc vuông quanh khóa? Vấn đề cụ thể của tôi là tôi muốn truy cập vào các phần tử của một mảng được trả về bởi một hàm. Hàm Say (args) trả về một mảng. Tại sao là $ var = function (args) [0]; la mắng tôi về các dấu ngoặc vuông? Tôi có thể làm điều gì đó như $ var = function (args) .value (0); hoặc tôi thiếu cái gì đó rất cơ bản?truy cập các giá trị mảng không có dấu ngoặc vuông trong php

+0

php đề cập đến đây là tham chiếu mảng chức năng. Nó đã được đưa vào php kể từ phiên bản 5.4 http://php.net/manual/en/migration54.new-features.php – Steve

Trả lời

10

Như những người khác đã nói, bạn có khá nhiều phải sử dụng một biến tạm thời:

$temp = myFunction(); 
$value = $temp[0]; 

Nhưng, nếu biết cấu trúc của mảng được trả về, có thể tránh biến tạm thời.

Nếu bạn chỉ muốn các thành viên đầu tiên:

$value = reset(myFunction()); 

Nếu bạn muốn thành viên cuối cùng:

$value = end(myFunction()); 

Nếu bạn muốn bất kỳ ai ở giữa:

// second member 
list(, $value) = myFunction(); 

// third 
list(, , $value) = myFunction(); 

// or if you want more than one: 

list(, , $thirdVar, , $fifth) = myFunction(); 
+0

Hey, thông minh! 'list()' không bao giờ ngừng làm tôi ngạc nhiên. +1. –

+1

reset() và end() yêu cầu tham số là tham chiếu. Bạn nhận được thông báo E_STRICT trong các phiên bản gần đây của php. – goat

+1

có, tôi đã làm điều này với các biến tạm thời, nhưng đã tự hỏi liệu tôi thực sự cần thiết. bây giờ tôi chỉ tự hỏi _why_ tôi có. nhưng trong mọi trường hợp, việc sử dụng danh sách() của bạn khá thông minh. cảm ơn! – amb

2

Trong PHP, khi nhận được một mảng như là kết quả chức năng, rất tiếc bạn phải làm thêm một bước:

$temp_array = function($args); 
$var = $temp_array[0]; 

Đối với các đối tượng, điều này đã được nới lỏng trong PHP 5. Bạn có thể làm:

$echo function($args)->property; 

(được cung cấp function lợi nhuận một đối tượng của khóa học.)

+2

Nó hút nhưng đây là cách duy nhất để làm điều này. Một trong nhiều lý do để ghét PHP. –

+0

@Luke đúng, nhưng không * rằng * imo xấu. Ai biết được, nó có thể được cố định trong PHP 7 :) –

+0

@Luke - đó là một chút mạnh mẽ phải không? – nickf

1
function getKey($array, $key){ 
    return $array[$key]; 
} 

$var = getKey(myFunc(args), $key); 

không có cách nào để làm điều này mà không cần thêm chức năng người dùng. Nó không chỉ là một phần của cú pháp.

Bạn có thể luôn luôn chỉ làm điều đó cách thời trang cũ

$array = myFunc(); 
$value = $array[0]; 
1

gì chính xác khớp với mong đợi của bạn là:

echo pos(array_slice($a=myFunc(), pos(array_keys(array_keys($a), 'NameOfKey')); 

trả lời Kinetix Kin, Taipei

1

nếu bạn muốn điều này, tốt nhất là trả lại một đối tượng (thật không may, nó hoàn toàn không hỗ trợ điều này). Heres một cách điên tôi đã có thể tìm ra mặc dù, ra khỏi sự mới lạ (xin vui lòng không làm điều này!):

function returnsArray(){ 
    return array("foo" => "bar"); 
} 

echo json_decode(json_encode((object)returnsArray()))->foo; 
//prints 'bar' 

Vì vậy yeah..until họ thêm hỗ trợ cho mảng dereferencing trong php, tôi nghĩ rằng bạn nên có lẽ chỉ đúc mảng trở lại như một đối tượng:

return (object)array("foo" => "bar"); 

và sau đó bạn có thể làm returnsArray() -> foo, vì php thư giãn dereferencing cho các đối tượng nhưng không phải các mảng .. hoặc tất nhiên viết một hàm wrapper như những người khác đã gợi ý.

+0

cũng có vẻ như hỗ trợ cho điều này gần đây đã được thêm vào php? http://wiki.php.net/rfc/functionarraydereferencing – mutexkid