2012-01-17 24 views
13

Tôi không chắc chắn nếu điều này là có thể, nhưng tôi không thể tìm ra cách thực hiện ...Lấy phần tử từ mảng PHP được trả về bởi hàm

Tôi muốn tìm một phần tử cụ thể của một mảng được trả về bởi một hàm, mà không cần chuyển nó vào một mảng ... mà không cần phải đầu tiên vào một mảng ... như là ...

$item = getSomeArray()[1]; 


function getSomeArray(){ 
    $ret = Array(); 
    $ret[0] = 0; 
    $ret[1] = 100; 
    return $ret; 
} 

Cú pháp chính xác cho điều này là gì?

+1

thể trùng lặp của [Truy cập mảng trả về bởi một hàm trong php] (http: //stackoverflow.com/questions/1459377/access-array-returned-by-a-function-in-php) – outis

+0

http://stackoverflow.com/a/35601314/2035600 – shan

Trả lời

15

PHP không thể thực hiện điều này nhưng, đó là một giới hạn nổi tiếng. Bạn có mọi quyền được tự hỏi "bạn đang đùa tôi?". Lấy làm tiếc.

Nếu bạn không nhớ tạo ra một E_STRICT cảnh báo bạn luôn có thể rút khỏi các yếu tố đầu tiên và cuối cùng của một mảng với resetend tương ứng - điều này có nghĩa rằng bạn cũng có thể kéo ra yếu tố nào kể từ array_slice có thể sắp xếp đối với người bạn muốn duy trì đầu tiên hoặc cuối cùng, nhưng đó có lẽ là việc quá xa.

Nhưng tuyệt vọng không: (vào lúc này sắp tới) bản phát hành PHP 5.4 sẽ bao gồm chính xác tính năng này (dưới tên array dereferencing).

Cập nhật: Tôi chỉ nghĩ đến một kỹ thuật khác có thể hoạt động. Có lẽ lý do chính đáng mà tôi chưa bao giờ sử dụng nó hoặc thấy nó được sử dụng, nhưng về mặt kỹ thuật nó thực hiện công việc.

// To pull out Nth item of array: 
list($item) = array_slice(getSomeArray(), N - 1, 1); 
+0

wow ... thật kỳ quặc ... ok ... không phải lo lắng ... Tôi sẽ vượt qua nó thông qua một mảng chủ temp. Cảm ơn rất nhiều. –

2

Có, php không thể làm điều đó. Bạn có thể sử dụng ArrayObect, như vậy:

$item = getSomeArray()->{1}; 
// Credits for curly braces for Bracketworks  

function getSomeArray(){ 
    $ret = Array(); 
    $ret[0] = 0; 
    $ret[1] = 100; 
    return new ArrayObject($ret, ArrayObject::ARRAY_AS_PROPS); 
} 

Được rồi, có thể không hoạt động với các phím số nhưng tôi không chắc chắn.

+2

Điều đó sẽ gây tử vong; bạn cần phải làm 'getSomeArray() -> {1};' Sử dụng dấu ngoặc nhọn cho bất kỳ tên thuộc tính không tuân thủ nào; xem cách sử dụng cơ bản của SimpleXML (http://www.php.net/manual/en/simplexml.examples-basic.php) để biết thông tin liên quan. – Dan

0

Như những người khác nói, không có cách nào trực tiếp để làm điều này, tôi thường chỉ gán nó vào một biến như sau:

$items = getSomeArray(); 
$item = $items[1]; 


function getSomeArray(){ 
    $ret = Array(); 
    $ret[0] = 0; 
    $ret[1] = 100; 
    return $ret; 
} 
0

Tôi khá chắc chắn rằng không thể làm trong PHP. Bạn phải gán mảng được trả về cho mảng khác trước khi bạn có thể truy cập các phần tử bên trong hoặc sử dụng nó trực tiếp trong một số hàm khác sẽ lặp lại mặc dù mảng được trả về (ví dụ var_dump (getSomeArray())).

2

Cú pháp bạn đang đề cập đến được gọi là dereferencing mảng chức năng. Nó chưa được triển khai và có RFC for it.

Cú pháp được chấp nhận chung là gán giá trị trả về của hàm cho mảng và truy cập giá trị từ đó với cú pháp $array[1].

Điều đó nói rằng, tuy nhiên bạn cũng có thể chuyển khóa mà bạn muốn làm đối số cho hàm của mình.

function getSomeArray($key = null) { 
    $array = array(
    0 => "cheddar", 
    1 => "wensleydale" 
); 

    return is_null($key) ? $array : isset($array[$key]) ? $array[$key] : false;  
} 

echo getSomeArray(0); // only key 0 
echo getSomeArray(); // entire array 
1

Tôi biết đây là một câu hỏi cũ, nhưng, trong ví dụ của bạn, bạn cũng có thể sử dụng array_pop() để có được những yếu tố cuối cùng của mảng, (hoặc array_shift() để có được đầu tiên).

<?php 
$item = array_pop(getSomeArray()); 


function getSomeArray(){ 
    $ret = Array(); 
    $ret[0] = 0; 
    $ret[1] = 100; 
    return $ret; 
} 
+0

cảm ơn ... đó không phải là tất cả ý định của tôi, mặc dù tôi có thể thấy với một loạt 2 mặt hàng như thế nào nó có thể được hiểu sai như những gì tôi đang tìm kiếm. Tôi đã cố gắng tìm ra cách để lấy các phần tử mảng được trả về trực tiếp bởi một hàm. Tôi đã từ bỏ PHP như là một cái máy hấp khổng lồ mà nó đang và không nhìn lại. Cảm ơn mặc dù! :) –

2

PHP 5.4 đã được thêm vào mảng dereferencing, đây là ví dụ từ tài liệu mảng PHP:

Ví dụ # 7 mảng dereferencing

function getArray() { 
    return ['a', 'b', 'c']; 
} 

// PHP 5.4 
$secondElement = getArray()[0]; // output = a 

// Previously 
$tmp = getArray(); 
$secondElement = $tmp[0]; // output = a 
Các vấn đề liên quan