2009-08-10 19 views
9

मैं निम्नलिखित सरणी है:नेस्टेड 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) 
    ) 
    ) 
) 

मैं एक नेस्टेड foreach (उपयोग कर रहा हूँ) बाहरी सरणी में तत्वों के माध्यम से चलने के लिए लेकिन जब यह लेखकों मैं कर रहा हूँ की सूची थूकना के लिए आता है समस्याओं में चल रहा है। अर्थात् पागल foreach() घोंसले की वजह से प्रत्येक एक बहु (एकाधिक) बार outputting की समस्या। इस उदाहरण में घोंसले foreach() loops की तुलना में बेहतर दृष्टिकोण क्या होगा?

अद्यतन (समाधान के साथ)

यहाँ पाश मैं पर बसे, थोड़ा गंदा (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"; 
} 
+1

ठीक लगता है, हो सकता है आप अपने पाश कोड पोस्ट करना चाहिए? –

+3

नेस्टेड लूप डिफ़ॉल्ट रूप से एक बुरी चीज नहीं हैं। चलो कुछ कोड देखते हैं। मेरा पहला जंगली अनुमान है कि आप आंतरिक लूप में बाहरी लूप से एक चर को ओवरराइट कर रहे हैं :) – Rufinus

+1

अपना लूप कोड पोस्ट करें। नेस्टिंग फोरैच ठीक है (assoc arrays का उपयोग करके आपको डीबग करने में मदद मिलेगी) – 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 - मैं उस स्टैक ओवरफ्लो थ्रेड में सभी उत्तरों का जिक्र कर रहा था। यदि वे कभी भी इन लिंक को तोड़ते हैं तो यह सबसे दुर्भाग्यपूर्ण होगा, इसलिए मुझे इसमें बहुत संदेह है – 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"; 
});