2008-08-25 37 views
19

Có một cách dễ dàng để lặp qua một mảng kết hợp của cấu trúc này trong PHP:iterating trên một mảng kết hợp phức tạp trong PHP

Mảng $searches có một chỉ số đánh số, với khoảng từ 4 đến 5 phần kết. Vì vậy, tôi không chỉ cần lặp lại qua số $searches[0] thông qua $searches[n], mà còn là $searches[0]["part0"] thông qua $searches[n]["partn"]. Phần cứng là các chỉ mục khác nhau có số lượng phần khác nhau (một số có thể bị thiếu một hoặc hai phần).

Suy nghĩ về cách làm điều này theo cách đẹp, gọn gàng và dễ hiểu?

Trả lời

38

Nest hai foreach loops:

foreach ($array as $i => $values) { 
    print "$i {\n"; 
    foreach ($values as $key => $value) { 
     print " $key => $value\n"; 
    } 
    print "}\n"; 
} 
+0

là $ i và $ giá trị biến tạm thời sao chép từ mảng kết hợp hoặc tham chiếu đến tham chiếu mảng thực tế? –

+1

@ MMAmail.com: Mã này không sử dụng tài liệu tham khảo, nó sử dụng bản sao. Nếu bạn thực sự muốn sử dụng tài liệu tham khảo (nhưng bạn thường không!), Bạn cần thêm tiền tố cho các tên biến với dấu và, nghĩa là '& $ i' và' & $ values' trong khai báo của chúng và bạn nên 'bỏ đặt' các biến sau vòng lặp. –

6

Bạn sẽ có thể sử dụng một foreach Statment lồng nhau

từ php manual

/* foreach example 4: multi-dimensional arrays */ 
$a = array(); 
$a[0][0] = "a"; 
$a[0][1] = "b"; 
$a[1][0] = "y"; 
$a[1][1] = "z"; 

foreach ($a as $v1) { 
    foreach ($v1 as $v2) { 
     echo "$v2\n"; 
    } 
} 
+2

Chỉ 2 kích thước, không hoạt động cho 2+ kích thước –

0

có thể bạn chỉ cần lặp qua tất cả các "phần [n]" các mặt hàng và sử dụng isset để xem họ thực sự tồn tại hay không?

0

Tôi thực sự không chắc chắn những gì bạn có nghĩa là ở đây - chắc chắn là một cặp vòng foreach không những gì bạn cần?

foreach($array as $id => $assoc) 
{ 
    foreach($assoc as $part => $data) 
    { 
     // code 
    } 
} 

Hoặc bạn cần điều gì đó đệ quy? Tôi có thể giúp nhiều hơn với dữ liệu ví dụ và ngữ cảnh về cách bạn muốn dữ liệu được trả lại.

12

Trông giống như một nơi tốt cho một hàm đệ quy, đặc biệt. nếu bạn có nhiều hơn hai mức độ sâu.

function doSomething(&$complex_array) 
{ 
    foreach ($complex_array as $n => $v) 
    { 
     if (is_array($v)) 
      doSomething($v); 
     else 
      do whatever you want to do with a single node 
    } 
} 
37

Tôi biết đó là câu hỏi chiêu hồn, nhưng iterating trên Mảng nhiều chiều rất dễ dàng với Spl Vòng lặp

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 

foreach($iterator as $key=>$value) { 
    echo $key.' -- '.$value.'<br />'; 
} 

Xem

+0

Điều gì sẽ xảy ra nếu một trong các phần tử mảng là một đối tượng có thể lặp lại? – Petah

+0

@Petah nó sẽ được lặp lại. Xem http://codepad.org/sd8eBvcu – Gordon

+0

bạn có biết cách loại trừ nó không bị lặp lại không, vì vậy chỉ mảng được lặp lại? – Petah

0

Cân nhắc mảng dimentional đa này, Tôi hy vọng chức năng này sẽ giúp ích.

$n = array('customer' => array('address' => 'Kenmore street', 
       'phone' => '121223'), 
     'consumer' => 'wellington consumer', 
     'employee' => array('name' => array('fname' => 'finau', 'lname' => 'kaufusi'), 
        'age' => 32, 
       'nationality' => 'Tonga') 
    ); 



iterator($n); 

function iterator($arr){ 

    foreach($arr as $key => $val){ 

    if(is_array($val))iterator($val); 

    echo '<p>key: '.$key.' | value: '.$val.'</p>'; 

    //filter the $key and $val here and do what you want 
    } 

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