Вложенный 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 (With solution)

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

$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";
}
 Paul Dixon11 авг. 2009 г., 00:15
звучит хорошо, может быть, вы должны опубликовать свой код цикла?
 Rufinus11 авг. 2009 г., 00:16
Вложенные циклы по умолчанию не являются плохой вещью. давайте посмотрим код. Моя первая дикая догадка - вы перезаписываете переменную из externalloop во внутреннем цикле :)
 Dirk11 авг. 2009 г., 00:17
Разместите свой код цикла. Вложение foreach хорошо (использование ассоциативных массивов поможет вам отладить)

Ответы на вопрос(4)

 29 авг. 2012 г., 13:27
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
 31 авг. 2012 г., 19:06
@edorian - я имел в виду все ответы в этой теме Stackoverflow. Если они когда-нибудь сломают эти ссылки, это будет очень неудачно, поэтому я очень сомневаюсь в этом
 29 авг. 2012 г., 13:27
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.

Просто для удовольствия. если тыreally хотите избежать петель, попробуйте это:

// 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";
});
Решение Вопроса

Почему вы этого не делаете

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

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

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

Ваш ответ на вопрос