2009-08-10 10 views
9

je le tableau suivant:Nested 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) 
    ) 
    ) 
) 

J'utilise un foreach imbriquée() pour marcher à travers les éléments du tableau extérieur, mais quand il vient à cracher sur la liste des auteurs que je suis en cours d'exécution dans des problèmes. A savoir le problème de sortir plusieurs fois (plusieurs) fois à cause de l'imbrication foreach() fou. Quelle serait une meilleure approche que l'imbrication des boucles foreach() dans cet exemple?

MISE À JOUR (Avec la solution)

Voici la boucle je me suis installé sur, un peu en désordre (à mon humble avis), mais cela fonctionne:

$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"; 
} 
+1

sonne bien, peut-être vous devriez envoyer votre code de boucle? –

+3

Les boucles imbriquées ne sont pas par défaut une mauvaise chose. permet de voir du code. Ma première conjecture est d'écraser une variable du loop externe dans la boucle intérieure :) – Rufinus

+1

Postez votre code de boucle. L'imbrication de foreach est très bien (l'utilisation de tableaux assoc vous aiderait à déboguer) – Dirk

Répondre

6

Pourquoi ne pas vous faire

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

Si votre problème est que vous avez le même auteur sur plusieurs articles et obtenant ainsi des sorties plus d'une fois, la solution la plus simple est de construire un ensemble d'auteurs au lieu de les publier immédiatement.

Lorsque vous avez un tableau de tous les auteurs que vous avez traités jusqu'à présent, vous pouvez facilement comparer si cet auteur est déjà là ou non.

1

Prenez un look at this

+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. – edorian

+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. – edorian

+0

@edorian - Je me référais à toutes les réponses dans ce fil Stackoverflow. Si jamais ils cassent ces liens, ce serait vraiment dommage, alors je doute fortement – Bostone

3

Juste pour le plaisir. Si vous vraiment voulez éviter les boucles, essayez ceci:

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