2008-12-28 42 views
15

Tôi đang làm việc trên một chương trình sử dụng các con trỏ mảng nội bộ của PHP để lặp lại cùng một mảng đa chiều. Tôi cần phải nhận được một phần tử từ hàng hiện tại, và tôi đã làm nó như vậy:Truy cập phần tử mảng PHP có chức năng?

$arr[key($arr)]['item'] 

Tuy nhiên, tôi muốn nhiều thích sử dụng cái gì đó như:

current($arr)['item'] // invalid syntax 

Tôi hy vọng có một chức năng ra khỏi đó mà tôi đã bỏ lỡ trong quét của tôi về tài liệu mà sẽ cho phép tôi để truy cập vào các phần tử như vậy:

getvalue(current($arr), 'item') 

hoặc

current($arr)->getvalue('item') 

Mọi đề xuất?

+2

Bạn đã tìm thấy giải pháp tốt nhất: $ arr [key ($ arr)] ['item'] –

+0

Cách tiếp cận 'getvalue' sẽ hữu ích ngay cả đối với mảng đơn dimmensional nữa. Nó sẽ cho phép làm việc với các giới hạn cú pháp ≤5.3 và cho phép truy cập một phần tử từ một mảng, được trả về bởi một cuộc gọi hàm, trực tiếp trong một câu lệnh. Tôi đang thiếu chức năng nội bộ như vậy. – Glutexo

Trả lời

12

Tôi rất nghi ngờ có một chức năng như vậy, nhưng nó tầm thường để viết

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

Chỉnh sửa: Tính đến PHP 5.4, bạn có thể phần tử mảng chỉ số trực tiếp từ biểu thức chức năng, current($arr)['item'].

+3

Tôi nghĩ rằng đây có lẽ là những gì tôi sẽ làm. Nếu bạn chính xác rằng không có chức năng như vậy, đó là một sự giám sát khá xấu. –

1

Bạn đã thử sử dụng một trong số iterator classes chưa? Có thể có một cái gì đó trong đó làm chính xác những gì bạn muốn. Nếu không, bạn có thể có được những gì bạn muốn bằng cách mở rộng lớp ArrayObject.

+0

Chỉ cần nhìn vào những - có vẻ như đó chỉ là một cách hướng đối tượng để lặp qua mảng.ArrayIterator :: current trả về mục hiện tại, giống như hàm current() hiện tại, điều này không thực sự là vấn đề tôi gặp phải. –

-1

Nếu điều này không hoạt động, mảng đa chiều của bạn được tạo ra như thế nào? Một var_dump() có thể giúp đỡ.

$subkey = 'B'; 
$arr = array(
    $subkey => array(
     'AB' => 'A1', 
     'AC' => 'A2' 
    ) 
); 


echo current($arr[$subkey]); 
next($arr[$subkey]); 
echo current($arr[$subkey]); 
+0

Sự lặp lại tôi đang thực hiện chỉ thực sự dọc theo mảng chính. Tôi đã nói "đa chiều" vì các phần tử tương ứng của mảng chính là mảng của chúng, nhưng tôi không muốn lặp lại chúng - tôi chỉ muốn truy cập chúng một cách thuận tiện. –

+0

Cách xử lý $ arr [$ subkey] dưới dạng mảng hoặc $ new_arr = array_values ​​($ arr [$ subkey])? Lưu ý: điều gì khác nhau giữa yêu cầu hiện tại của bạn ($ arr) ['item'] và hiện tại ($ arr ['item'])? – chelmertz

-1

Tôi thường sử dụng

foreach ($arr as $key=>$val) { 
    $val['item'] /*$val is the value of the array*/ 
    $key   /*$key is the key used */ 
} 

thay vì

tiếp theo ($ arr)/hiện tại ($ arr)

+0

Tôi cũng sử dụng điều đó - vì lợi ích của câu hỏi, tôi đã loại bỏ thực tế rằng tôi đang thực sự đi xuống hai mảng được sắp xếp để tìm sự khác biệt, và tôi chắc rằng foreach không hỗ trợ loại truy cập đó, nhưng tôi có thể sai rồi. Dù sao, cảm ơn bạn đã trả lời. :) –

0

Chức năng này có thể là một chút lenghty nhưng tôi sử dụng nó tất cả thời gian, đặc biệt trong scenarious như:

if (array_key_exists('user', $_SESSION) === true) 
{ 
    if (array_key_exists('level', $_SESSION['user']) === true) 
    { 
     $value = $_SESSION['user']['level']; 
    } 

    else 
    { 
     $value = 'DEFAULT VALUE IF NOT EXISTS'; 
    } 
} 

else 
{ 
    $value = 'DEFAULT VALUE IF NOT EXISTS'; 
} 

Turns to này:

Value($_SESSION, array('user', 'level'), 'DEFAULT VALUE IF NOT EXISTS'); 

Dưới đây là các chức năng:

function Value($array, $key = 0, $default = false) 
{ 
    if (is_array($array) === true) 
    { 
     if (is_array($key) === true) 
     { 
      foreach ($key as $value) 
      { 
       if (array_key_exists($value, $array) === true) 
       { 
        $array = $array[$value]; 
       } 

       else 
       { 
        return $default; 
       } 
      } 

      return $array; 
     } 

     else if (array_key_exists($key, $array) === true) 
     { 
      return $array[$key]; 
     } 
    } 

    return $default; 
} 

PS: Bạn cũng có thể sử dụng các mảng unidimensional, như thế này:

Value($_SERVER, 'REQUEST_METHOD', 'DEFAULT VALUE IF NOT EXISTS'); 
Các vấn đề liên quan