2009-08-10 2 views
9

У меня есть следующий массив:Уплотненный Еогеасп()

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() в этом примере?

UPDATE (с раствором)

Здесь есть петля я завещал, немного грязный (ИМХО), но это работает:

$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

звучит хорошо, может быть, вы должны разместить свой код цикла? –

+3

Вложенные петли по умолчанию не являются плохими. позволяет увидеть некоторый код. Моя первая дикая догадка заключается в том, что вы переписываете переменную из внешнего кольца во внутреннем цикле :) – Rufinus

+1

Опубликуйте свой код цикла. Вложение foreach в порядке (использование вспомогательных массивов поможет вам отладить) – Dirk

ответ

6

Почему бы вам не сделать

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

Если ваша проблема в том, что у вас есть один и тот же автор на нескольких статьях и, таким образом, получая выход более одного раза, самым простым решением является создание массива авторов, а не вывод их сразу.

Когда у вас есть массив всех авторов, которые вы обработали до сих пор, вы можете легко сравнивать, если этот автор уже там или нет.

1

Возьмите look at this

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – edorian

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – edorian

+0

@edorian - Я имел в виду все ответы в потоке Stackoverflow. Если они когда-нибудь нарушат эти ссылки, это будет очень неудачно, поэтому я очень сомневаюсь в этом – Bostone

3

Просто для удовольствия. Если вы действительно хотите, чтобы избежать петли, попробуйте следующее:

// 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"; 
});
Смежные вопросы