2011-05-01 11 views
7

किसी के लिए जवाब देने के लिए यहां कुछ आसान है। मैंने खोज करने की कोशिश की है लेकिन मुझे नहीं पता कि मैं वास्तव में क्या देख रहा हूं।मैं सरणी में केवल कुछ ही आइटम कैसे चुनूं?

मेरे पास एक फिल्म के लिए कलाकार और क्रू सदस्यों के PHP में, JSON स्ट्रिंग से एक सरणी है।

यहाँ मैं काम नाम 'अभिनेता'

foreach ($movies[0]->cast as $cast) { 
     if ($cast->job == 'Actor') { 
    echo '<p><a href="people.php?id=' . $cast->id . '">' . $cast->name . ' - ' . $cast->character . '</a></p>'; 
     } 
    } 

समस्या है, मैं काम नाम 'अभिनेता' के साथ कितने लोगों को सीमित करने के लिए सक्षम होने के लिए चाहते हैं खींच रहे हैं साथ ही लोगों को बाहर खींच रहा हूँ बाहर। कहें, पहला 3.

तो मैं इस सरणी से केवल इन लोगों में से केवल 3 को कैसे चुनूं?

+0

नीचे दिए गए लोगों के लिए एक और विकल्प लूप –

उत्तर

3

एक चर $num_actors कहा जाता है कि कितने आप पहले से ही गिना गया है ट्रैक करने के लिए एक बार आप के लिए 3.

$num_actors = 0; 
foreach ($movies[0]->cast as $cast) { 
    if ($cast->job == 'Actor') { 
     echo '...'; 

     $num_actors += 1; 
     if ($num_actors == 3) 
      break; 
    } 
} 
+0

में काउंटर जोड़ने के लिए मदद के लिए सभी को धन्यवाद। मैंने इसे यहां चुना है हालांकि यह लोकप्रिय लग रहा था और यह मेरे लिए काम करता था। – Rowan

1

एक काउंटर और एक कथन जोड़ें।

$count = 0; 
foreach ($movies[0]->cast as $cast) 
{ 
    if ($cast->job == 'Actor') 
    { 
    echo '<p><a href="people.php?id=' . $cast->id . '">' . $cast->name . ' - ' . $cast-character . '</a></p>'; 

    if($count++ >= 3) 
     break; 
    } 
} 
1
$limit = 3; 
$count = 0; 

    foreach ($movies[0]->cast as $cast) { 
     // You can move the code up here if all you're getting is Actors 
     if ($cast->job == 'Actor') { 
      if ($count == $limit) break;// stop the loop 
      if ($count == $limit) continue;// OR move to next item in loop 
      $count++; 
      echo '<p><a href="people.php?id=' 
        . $cast->id 
        . '">' 
        . $cast->name 
        . ' - ' 
        . $cast->character 
        . '</a></p>'; 
     } 
    } 
3
$actors=array_filter($movies[0]->cast, function ($v) { 
    return $v->job == 'Actor'; 
}); 

$first3=array_slice($actors, 0, 3); 

या यहाँ तक कि

मिल लूप से बाहर break उपयोग करें, और
$limit=3; 
$actors=array_filter($movies[0]->cast, function ($v) use (&$limit) { 
    if ($limit>0 && $v->job == 'Actor') { 
     $limit--; 
     return true; 
    } 
    return false; 
}); 
4

ठीक है - यह मैं इस समस्या के लिए थोड़ा अधिक मार डाला गया है, लेकिन शायद यह कुछ शैक्षणिक उद्देश्यों को पूरा करता है। पीएचपी इटरेटर्स के एक सेट के साथ आता है जिसका उपयोग वस्तुओं के दिए गए सेट पर अमूर्त पुनरावृत्ति के लिए किया जा सकता है।

class ActorIterator extends FilterIterator { 
    public function accept() { 
     return $this->current()->job == 'Actor'; 
    } 
} 

$maxCount = 3; 
$actors = new LimitIterator(
    new ActorIterator(
     new ArrayIterator($movies[0]->cast) 
    ), 
    0, 
    $maxCount 
); 
foreach ($actors as $actor) { 
    echo /*... */; 
} 

सार वर्ग FilterIterator विस्तार करके हम एक फिल्टर है कि दी गई सूची में से केवल अभिनेताओं रिटर्न को परिभाषित करने में सक्षम हैं। LimitIterator आपको किसी दिए गए सेट पर पुनरावृत्ति को सीमित करने की अनुमति देता है और ArrayIterator देशी सरणी को Iterator इंटरफ़ेस के साथ संगत बनाने के लिए एक सरल सहायक है। इटरेटर डेवलपर को चेन बनाने की अनुमति देते हैं जो पुनरावृत्ति प्रक्रिया को परिभाषित करता है जो उन्हें बेहद लचीला और शक्तिशाली बनाता है।

जैसा कि मैंने परिचय में कहा था: दिए गए समस्या को इस इटरेटर सामान के बिना आसानी से हल किया जा सकता है, लेकिन यह कुछ विस्तारित विकल्पों के साथ डेवलपर प्रदान करता है और कोड-पुन: उपयोग को सक्षम बनाता है। उदाहरण के लिए, आप ActorIterator को CastIterator पर बढ़ा सकते हैं जो आपको कन्स्ट्रक्टर में फ़िल्टर करने के लिए कास्ट प्रकार को पास करने की अनुमति देता है।

+0

+1 बहुत अच्छा एक :) – kapa

संबंधित मुद्दे