web-dev-qa-db-ja.com

ネストされた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()ループをネストするよりも良いアプローチは何でしょうか?

PDATE(ソリューションあり)

これが私が決めたループで、少し厄介です(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";
}
13

やってみませんか

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";
}
11
michal kralik

ただ楽しみのために。 本当にループを避けたい場合は、次のことを試してください。

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

複数の記事に同じ著者がいて、複数回出力されることが問題である場合、最も簡単な解決策は、すぐに出力するのではなく、著者の配列を作成することです。

これまでに処理したすべての作成者の配列がある場合、この作成者がすでにそこにいるかどうかを簡単に比較できます。

3
1
Bostone