2009-08-10 34 views
9

Ho la seguente matrice:foreach nidificati()

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) 
    ) 
    ) 
) 

Sto usando un foreach nidificato() per camminare attraverso gli elementi nella matrice esterno, ma quando si tratta di sputare fuori la lista degli autori Sono incorrere in problemi. Vale a dire il problema di emettere ciascuna di esse (più volte) a causa del pazzo nidificazione di foreach(). Quale sarebbe un approccio migliore rispetto all'annidamento dei cicli foreach() in questo esempio?

UPDATE (con soluzione)

Ecco l'anello ho optato per, un po 'confuso (IMHO), ma funziona:

$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

suona bene, forse si dovrebbe pubblicare il tuo codice di ciclo? I loop nidificati di –

+3

non sono di default una cosa negativa. vediamo un po 'di codice. La mia prima ipotesi è quella di sovrascrivere una variabile da outerloop nel ciclo interno :) – Rufinus

+1

Pubblica il tuo codice di loop. Nido foreach va bene (utilizzando gli array associati potrebbe facilitare il debug) – Dirk

risposta

6

Perché non fai

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

Se il vostro problema è che avete lo stesso autore su più articoli e ottenendo così output più di una volta, la soluzione più semplice è quella di creare una serie di autori invece di emetterli immediatamente.

Quando hai un array di tutti gli autori che hai elaborato finora puoi facilmente confrontare se questo autore è già lì dentro oppure no.

1

Take a look at this

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – edorian

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – edorian

+0

@edorian - Mi riferivo a tutte le risposte in quel thread Stackoverflow. Se mai interrompessero questi collegamenti sarebbe molto sfortunato, quindi ne dubito fortemente – Bostone

3

Solo per divertimento. Se davvero vuole evitare loop, provate questo:

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