2009-08-10 92 views
9

tôi có các mảng sau:foreach lồng nhau()

Array ( 
    [1] => Array ( 
    [spubid] => A00319 
    [sentered_by] => pubs_batchadd.php 
    [sarticle] => Lateral mixing of the waters of the Orinoco, Atabapo 
    [spublication] => Acta Cientifica Venezolana 
    [stags] => acta,confluence,orinoco,rivers,venezuela,waters 
    [authors] => Array ( 
     [1] => Array ( 
     [stype] => Author 
     [iorder] => 1 
     [sfirst] => A 
     [slast] => Andersen) 
     [2] => Array ( 
     [stype] => Author 
     [iorder] => 2 
     [sfirst] => S. 
     [slast] => Johnson) 
     [3] => Array ( 
     [stype] => Author 
     [iorder] => 3 
     [sfirst] => J. 
     [slast] => Doe) 
    ) 
    ) 
) 

Tôi đang sử dụng foreach lồng nhau() để đi bộ qua các yếu tố trong mảng bên ngoài nhưng khi nói đến phun ra danh sách các tác giả tôi gặp vấn đề. Cụ thể là vấn đề xuất ra mỗi một (nhiều) lần bởi vì sự điên rồ foreach() làm tổ. Điều gì sẽ là một cách tiếp cận tốt hơn làm tổ foreach() vòng trong ví dụ này?

UPDATE (Với giải pháp)

Đây là vòng lặp tôi giải quyết trên, một chút lộn xộn (IMHO) nhưng nó hoạt động:

$sauthors = NULL; 
$stitle = NULL; 

foreach($apubs as $apub) 
{ 
    $stitle = $apub['sarticle']; 
    foreach($apub as $svar=>$sval) 
    { 
    if($svar === "authors") 
    { 
     foreach($sval as $apeople) 
     { 
     $sauthors .= $apeople['slast'].", ".$apeople['sfirst']."; "; 
     } 
    } 
    } 
    echo "$sauthors<br />\n$stitle<br />\n"; 
} 
+1

có vẻ tốt, có thể bạn nên đăng mã vòng của mình? –

+3

vòng lặp lồng nhau không theo mặc định là một điều xấu. cho phép xem một số mã. Đoán hoang dã đầu tiên của tôi là bạn ghi đè lên một biến từ vòng ngoài trong vòng lặp bên trong :) – Rufinus

+1

Đăng mã vòng lặp của bạn. Nesting foreach là tốt (sử dụng mảng assoc sẽ giúp bạn gỡ lỗi) – Dirk

Trả lời

6

Tại sao bạn không làm

foreach($apubs as $apub) { 
    $sauthors = ''; 
    $stitle = $apub['sarticle']; 
    foreach($apub['authors'] as $author) { 
    $sauthors .= $author['slast'].", ".$author['sfirst']."; "; 
    } 

    echo "$sauthors<br />\n$stitle<br />\n"; 
} 
2

Nếu vấn đề của bạn là bạn phải cùng tác giả trên nhiều bài viết và do đó nhận được kết quả nhiều lần, giải pháp đơn giản nhất là xây dựng một loạt các tác giả thay vì xuất chúng ngay lập tức.

Khi bạn có một loạt các tác giả mà bạn đã xử lý cho đến nay bạn có thể dễ dàng so sánh nếu tác giả này đã ở trong đó hay chưa.

1
+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần cần thiết của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – edorian

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – edorian

+0

@edorian - Tôi đang đề cập đến tất cả các câu trả lời trong luồng Stackoverflow đó. Nếu họ phá vỡ những liên kết này, nó sẽ là điều đáng tiếc nhất, vì vậy tôi rất nghi ngờ nó – Bostone

3

Just for fun. Nếu bạn thực sự muốn tránh các vòng lặp, hãy thử điều này:

// Pre PHP 5.3: 

function cb2($e) 
{ 
    return $e['slast'] . ', ' . $e['sfirst']; 
} 

function cb1($e) 
{ 
    $authors = array_map('cb2', $e['authors']); 
    echo implode('; ', $authors) . ":<br />\n" . $e['sarticle'] . "<br />\n"; 
} 

array_walk($data, 'cb1'); 



// PHP 5.3 (untested): 

array_walk($data, function($e) 
{ 
    $authors = array_map(function($e) 
    { 
     return $e['slast'] . ', ' . $e['sfirst']; 
    }, 
    $e['authors']); 

    echo implode('; ', $authors) . ":<br />\n" . $e['sarticle'] . "<br />\n"; 
});