2009-08-10 185 views
9

我有以下陣列:嵌套的foreach()

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) 
    ) 
    ) 
) 

我使用一個嵌套的foreach()外陣列通過元素走路,但是當涉及到吐出作者我的列表遇到問題。也就是說,由於瘋狂的foreach()嵌套,每個輸出都會出現多次(多次)的問題。在這個例子中嵌套foreach()循環會是更好的方法嗎?

UPDATE(帶解決方案)

這裏是環我看中了,有點亂(恕我直言),但它的工作原理:

$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

聽起來不錯,也許你應該張貼您的循環代碼? – 2009-08-10 22:15:16

+3

嵌套循環默認情況下不是壞事。讓我們看看一些代碼。我的第一個猜測是你在內循環中覆蓋外循環中的一個變量:) – Rufinus 2009-08-10 22:16:44

+1

發佈你的循環代碼。 嵌套的foreach很好(使用assoc數組可以幫助你調試) – Dirk 2009-08-10 22:17:13

回答

6

你爲什麼不只是爲了好玩做

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

如果你的問題是,你有相同的作者對多篇文章並因此獲得不止一次的輸出,最簡單的解決方案是構建一個作者數組,而不是立即輸出它們。

當你有一個你已經處理過的所有作者的數組時,你可以很容易地比較這個作者是否已經在那裏。

1

乘坐look at this

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – edorian 2012-08-29 11:27:52

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – edorian 2012-08-29 11:27:52

+0

@edorian - 我指的是Stackoverflow線程中的所有答案。如果他們斷絕這些聯繫,那將是最不幸的,所以我非常懷疑它 – Bostone 2012-08-31 17:06:00

3

。如果你真的爲了避免環路,試試這個:

// 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"; 
});