12


1

次のような配列があります。

Array([1] => Array([spubid] => A00319 [sentered_by] => pubs_batchadd.php [sarticle] =>オリノコ、アタバポの水域の横方向の混合>アクタ、合流、オリノコ、河川、ベネズエラ、水[著者] => Array([1] => Array([stype] =>作者[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(ソリューションあり)*

これは私が設定したループですが、ちょっと面倒です(私見)が、うまくいきます:

$ sauthors = NULL。 $ stitle = NULL。

foreach($ apubsを$ apubとして){$ stitle = $ apub ['sarticle']; "foreach($ svar => $ svalとしての$ apub){if($ svar ===" authors "){foreach($ speとしての$ sval){$ sauthors。= $ apeople ['slast']。"、 " $ apeople ['sfirst']。 ";"; echo "$ sauthors \ n $ stitle \ n"; }

4 Answer


8


なぜあなたはしませんか

foreach($ apubsを$ apubとして){$ sauthors = ''; $ stitle = $ apub ['sarticle']; foreach($ apub ['authors']を$ authorとして){$ sauthors。= $ author ['slast']。 "、"、 "。$ author ['sfirst']。"; "; }

echo "$ sauthors \ n $ stitle \ n"; }


3


もしあなたが複数の記事に同じ著者を持っていて、その結果何度も出力されるという問題がある場合、最も簡単な解決策はそれらをすぐに出力するのではなく一連の著者を作ることです。

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


3


ただ楽しみのために。 本当にループを避けたいのなら、これを試してください:

// Pre PHP 5.3:

function cb2($ e){return $ e ['slast']。 「、」。 $ e ['sfirst']; }

関数cb1($ e){$作者=配列マップ( 'cb2'、$ e ['作者']); echo implode( ';'、$ authors) ":\ n" $ e ['sarticle']。 "\ n"; }

array_walk($ data、 'cb1');


// PHP 5.3 (untested):

array_walk($ data、関数($ e){$ authors = array_map(関数($ e){return $ e ['slast']) 「、」。 $ e ['sfirst']; $ e ['作者']);

echo implode( ';'、$ authors) ":\ n" $ e ['sarticle']。 "\ n"; ;));