Вопрос по arrays, foreach, php, loops – Вложенный foreach ()

12

У меня есть следующий массив:

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

Ваш Ответ

4   ответа
4

Просто для удовольствия. если ты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";
});
1
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
@edorian - я имел в виду все ответы в этой теме Stackoverflow. Если они когда-нибудь сломают эти ссылки, это будет очень неудачно, поэтому я очень сомневаюсь в этом
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
8

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

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

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

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

Похожие вопросы