私は次の配列を持っています:
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";
}
やってみませんか
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";
});
複数の記事に同じ著者がいて、複数回出力されることが問題である場合、最も簡単な解決策は、すぐに出力するのではなく、著者の配列を作成することです。
これまでに処理したすべての作成者の配列がある場合、この作成者がすでにそこにいるかどうかを簡単に比較できます。