Вложенный 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 () в этом примере?

ОБНОВЛЕНИЕ (с решением)

Вот цикл, на котором я остановился, немного грязный (IMHO), но он работает:

 $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"; } 

Related of "Вложенный foreach ()"

Почему бы вам не сделать

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

Просто для удовольствия. Если вы действительно хотите избежать циклов, попробуйте следующее:

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

Если ваша проблема заключается в том, что у вас есть один и тот же автор в нескольких статьях и, таким образом, получение результатов несколько раз, самым простым решением является создание массива авторов, а не вывод их сразу.

Когда у вас есть массив всех авторов, которые вы обработали до сих пор, вы можете легко сравнить, если этот автор уже там или нет.

Взгляните на это