दिलचस्प पोस्ट
किसी स्लाइड को ऊपर / नीचे एनीमेशन के साथ एक दृश्य दिखाएं और छिपाएं जावा – छवि से पिक्सेल सरणी प्राप्त करें पिक्सेल में स्क्रीन आयाम प्राप्त करें जांचें कि क्या एक जावास्क्रिप्ट स्ट्रिंग यूआरएल है अक्षांश / लंबे निर्देशांक को देखते हुए, हम शहर / देश कैसे खोज सकते हैं? कंसोल कहाँ होता है। क्या लिखें ASP.NET में लिखे? HTTP पोस्ट अनुरोध कैसे भेजें और प्रतिक्रिया प्राप्त करें? जेएस फ़ाइल को अन्य जेएस फ़ाइल में कैसे शामिल किया जाए? "अप्रत्याशित टोकन ओ" त्रुटि दे रही JSON पार्सिंग सरल सूचीदृश्य बनाने के लिए एंड्रॉइड में अर्रे एडाप्टर बीबीसीडी को पार्स करने का सर्वोत्तम तरीका sys.argv स्क्रिप्ट में जिसका अर्थ है Android में मेरी गतिविधि से रिंगटोन कैसे सेट करें? वर्णों के बजाए सी कैरेक्टर लिटरियल इनट क्यों हैं? JQuery.validation में शासन करने के लिए समान नहीं जोड़ने के लिए कैसे

प्रथम और आखिरी चलनेवाली लुक में एक foreach लूप कैसे निर्धारित करें?

प्रश्न सरल है मेरे पास मेरे कोड में एक foreach पाश है:

 foreach($array as $element) { //code } 

इस पाश में, जब हम पहले या अंतिम यात्रा में हैं, तो मैं अलग ढंग से प्रतिक्रिया करना चाहता हूं।

यह कैसे करना है?

वेब के समाधान से एकत्रित समाधान "प्रथम और आखिरी चलनेवाली लुक में एक foreach लूप कैसे निर्धारित करें?"

आप एक काउंटर का उपयोग कर सकते हैं:

 $i = 0; $len = count($array); foreach ($array as $item) { if ($i == 0) { // first } else if ($i == $len - 1) { // last } // … $i++; } 

यदि आपके सरणी में अद्वितीय सरणी मान हैं, तो पहले और अंतिम तत्व का निर्धारण तुच्छ है:

 foreach($array as $element) { if ($element === reset($array)) echo 'FIRST ELEMENT!'; if ($element === end($array)) echo 'LAST ELEMENT!'; } 

यह काम करता है यदि आखिरी और पहली तत्व सरणी में सिर्फ एक बार प्रदर्शित होते हैं, अन्यथा आप झूठी सकारात्मक हो जाते हैं। इसलिए, आपको कुंजियों की तुलना करना है (वे सुनिश्चित करने के लिए अद्वितीय हैं)।

 foreach($array as $key => $element) { reset($array); if ($key === key($array)) echo 'FIRST ELEMENT!'; end($array); if ($key === key($array)) echo 'LAST ELEMENT!'; } 

अद्यतन: कुछ लोग एक foreach लूप के अंदर और / या सरणी पॉइंटर को संशोधित करने के बारे में चिंतित हैं। उन लोगों के लिए, आप लूप से पहले महत्वपूर्ण मान कैश कर सकते हैं।

 reset($array); $first = key($array); foreach($array as $key => $element) { if ($key === $first) echo 'FIRST ELEMENT!'; } 

पिछले आइटम को खोजने के लिए, मुझे लगता है कि कोड का यह टुकड़ा प्रत्येक समय काम करता है:

 foreach( $items as $item ) { if( !next( $items ) ) { echo 'Last Item'; } } 

उपरोक्त का और अधिक सरल संस्करण और मान लें कि आप कस्टम इंडेक्स का उपयोग नहीं कर रहे हैं …

 $len = count($array); foreach ($array as $index => $item) { if ($index == 0) { // first } else if ($index == $len - 1) { // last } } 

आप पहले और अंतिम तत्व को सरणी से हटा सकते हैं और उन्हें अलग से प्रोसेस कर सकते हैं।
इस कदर:

 <?php $array = something(); $first = array_shift($array); $last = array_pop($array); // do something with $first foreach ($array as $item) { // do something with $item } // do something with $last ?> 

इनलाइन टैग के बजाय सीएसएस में सभी स्वरूपण को निकालने से आपके कोड में सुधार होगा और लोड अवधि में तेजी आएगी।

जब भी संभव हो आप पीपी तर्क के साथ एचटीएमएल मिश्रण नहीं कर सकते।
आपके पेज को इस तरह से अलग करके कई और अधिक पठनीय और रखरखाव किया जा सकता है:

 <?php function create_menu($params) { //retirive menu items //get collection $collection = get('xxcollection') ; foreach($collection as $c) show_collection($c); } function show_subcat($val) { ?> <div class="sub_node" style="display:none"> <img src="../images/dtree/join.gif" align="absmiddle" style="padding-left:2px;" /> <a id="'.$val['xsubcatid'].'" href="javascript:void(0)" onclick="getProduct(this , event)" class="sub_node_links" > <?php echo $val['xsubcatname']; ?> </a> </div> <?php } function show_cat($item) { ?> <div class="node" > <img src="../images/dtree/plus.gif" align="absmiddle" class="node_item" id="plus" /> <img src="../images/dtree/folder.gif" align="absmiddle" id="folder"> <?php echo $item['xcatname']; ?> <?php $subcat = get_where('xxsubcategory' , array('xcatid'=>$item['xcatid'])) ; foreach($subcat as $val) show_subcat($val); ?> </div> <?php } function show_collection($c) { ?> <div class="parent" style="direction:rtl"> <img src="../images/dtree/minus.gif" align="absmiddle" class="parent_item" id="minus" /> <img src="../images/dtree/base.gif" align="absmiddle" id="base"> <?php echo $c['xcollectionname']; ?> <?php //get categories $cat = get_where('xxcategory' , array('xcollectionid'=>$c['xcollectionid'])); foreach($cat as $item) show_cat($item); ?> </div> <?php } ?> 

पहला खोज करने का प्रयास होगा:

 $first = true; foreach ( $obj as $value ) { if ( $first ) { // do something $first = false; //in order not to get into the if statement for the next loops } else { // do something else for all loops except the first } } 

बस यह काम करता है!

 //Store the last key $lastkey = key(end($array)); foreach($array as $key => $element) { ....do array stuff if ($lastkey === key($array)) echo 'LAST ELEMENT!'; } 

1: क्यों नहीं बयान के for एक सरल का उपयोग करें? यह मानते हुए कि आप एक असली सरणी का प्रयोग कर रहे हैं और एक Iterator नहीं है, आप आसानी से जांच सकते हैं कि काउंटर चर 0 या तत्वों की पूरी संख्या से कम है। मेरी राय में यह सबसे साफ और समझदार समाधान है …

 $array = array( ... ); $count = count( $array ); for ( $i = 0; $i < $count; $i++ ) { $current = $array[ $i ]; if ( $i == 0 ) { // process first element } if ( $i == $count - 1 ) { // process last element } } 

2: आपको अपने पेड़ की संरचना को स्टोर करने के लिए नेस्टेड समूह का उपयोग करने पर विचार करना चाहिए। इसके अतिरिक्त आप रिकर्सिव फ़ंक्शंस का उपयोग करके पूरी चीज़ को सुधार सकते हैं।

सबसे बढ़िया उत्तर:

 $arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); foreach ($arr as $a) { // This is the line that does the checking if (!each($arr)) echo "End!\n"; echo $a."\n"; } 

SQL क्वेरी जनरेटिंग स्क्रिप्ट के लिए, या कुछ भी जो पहले या अंतिम तत्वों के लिए अलग-अलग कार्य करता है, यह अनावश्यक चर जांच का उपयोग करने से बचने के लिए बहुत तेज (लगभग दो बार तेज़ है)

वर्तमान स्वीकार किए गए समाधान में लूप और एक चेक का उपयोग किया जाता है जो कि हर_सिंगल_इटरेशन को बनाया जाएगा, यह करने के लिए सही (तेज़) तरीका निम्न है:

 $numItems = count($arr); $i=0; $firstitem=$arr[0]; $i++; while($i<$numItems-1){ $some_item=$arr[$i]; $i++; } $last_item=$arr[$i]; $i++; 

एक छोटे घर का बनाम बेंचमार्क निम्नलिखित दिखाया:

test1: मॉडल morg के 100000 रन

समय: 1869.3430423737 मिलीसेकेंड

test2: अगर पिछले मॉडल का 100000 रन

समय: 3235.6359958649 मिलीसेकेंड

और यह इस प्रकार काफी स्पष्ट है कि जांच में बहुत अधिक खर्च होता है, और ज़ाहिर है कि आपके द्वारा जोड़े गए अधिक चर जांच भी बदतर हो जाती हैं;

बुलियन वैरिएबल का उपयोग अभी भी सबसे विश्वसनीय है, भले ही आप $value का पहला स्वरूप देखना चाहते हैं (मुझे मेरी स्थिति में और कई स्थितियों में इसे और अधिक उपयोगी पाया गया है) , जैसे कि:

 $is_first = true; foreach( $array as $value ) { switch ( $value ) { case 'match': echo 'appeared'; if ( $is_first ) { echo 'first appearance'; $is_first = false; } break; } } if( !next( $array ) ) { echo 'last value'; } } 

फिर पिछले $value को खोजने के लिए !next( $array ) बारे में कैसे होगा जो फिर से वापस लौटाएगा अगर पुनरावृत्त करने के लिए next() मान नहीं है

और अगर मैं एक काउंटर का उपयोग करने जा रहा था तो मैं इसके बजाय foreach for लूप का उपयोग करना पसंद करता हूं:

 $len = count( $array ); for ( $i = 0; $i < $len; $i++ ) { $value = $array[$i]; if ($i === 0) { // first } elseif ( $i === $len - 1 ) { // last } // … $i++; } 

कुंजी और मूल्यों के साथ ही यह काम करता है:

 foreach ($array as $key => $value) { if ($value === end($array)) { echo "LAST ELEMENT!"; } } 

@ मोर्ग से सर्वाधिक प्रभावी जवाब , अग्रभ्रष्ट के विपरीत, केवल उचित सरणियों के लिए काम करता है, हां नहीं है नक्शा वस्तुओं। यह उत्तर लूप के हर चलने के लिए सशर्त बयान के ऊपर से बचा जाता है, जैसा कि इनमें से अधिकांश उत्तर (स्वीकृत उत्तर सहित) में विशेष रूप से पहले और अंतिम तत्व को संभालते हैं, और मध्य तत्वों पर पाशन करते हैं।

array_keys फ़ंक्शन का उपयोग प्रभावी उत्तर कार्य foreach तरह करने के लिए किया जा सकता है:

 $keys = array_keys($arr); $numItems = count($keys); $i=0; $firstItem=$arr[$keys[0]]; # Special handling of the first item goes here $i++; while($i<$numItems-1){ $item=$arr[$keys[$i]]; # Handling of regular items $i++; } $lastItem=$arr[$keys[$i]]; # Special handling of the last item goes here $i++; 

मैंने इस पर बेंचमार्किंग नहीं किया है, लेकिन लूप में कोई तर्क जोड़ा नहीं गया है, जो कि प्रदर्शन में सबसे बड़ा हिट होता है, इसलिए मुझे संदेह था कि कुशल उत्तर के साथ उपलब्ध कराए गए बक्से बहुत करीब हैं।

यदि आप इस प्रकार की कार्यशीलता को क्रियान्वित करना चाहते हैं, तो मैंने इस तरह की पुनरावृत्ति पर एक स्विंग लिया है । यद्यपि, यदि आप दक्षता के बारे में चिंतित हैं, तो आप gist कोड को बेंचमार्क करना चाह सकते हैं मुझे यकीन नहीं है कि सभी फ़ंक्शन आविष्कार का परिचय कितना करना चाहिए।

जब मुझे एक ही समस्या है तो मैं इस धागे में आया था। मुझे केवल पहले तत्व प्राप्त करने की आवश्यकता है, तब तक मैं अपने कोड का पुनः विश्लेषण करूँगा जब तक यह मेरे दिमाग में नहीं आया।

 $firstElement = true; foreach ($reportData->result() as $row) { if($firstElement) { echo "first element"; $firstElement=false; } // Other lines of codes here } 

उपरोक्त कोड महान और पूर्ण हैं लेकिन अगर आपको केवल पहले तत्व की आवश्यकता है तो आप इस कोड को आज़मा सकते हैं।

निश्चित नहीं है कि यह अभी भी आवश्यक है लेकिन निम्न समाधान को iterators के साथ काम करना चाहिए और count आवश्यकता नहीं है।

 <?php foreach_first_last(array(), function ($key, $value, $step, $first, $last) { echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL; }); foreach_first_last(array('aa'), function ($key, $value, $step, $first, $last) { echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL; }); echo PHP_EOL; foreach_first_last(array('aa', 'bb', 'cc'), function ($key, $value, $step, $first, $last) { echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL; }); echo PHP_EOL; function foreach_first_last($array, $cb) { $next = false; $current = false; reset($array); for ($step = 0; true; ++$step) { $current = $next; $next = each($array); $last = ($next === false || $next === null); if ($step > 0) { $first = $step == 1; list ($key, $value) = $current; if (call_user_func($cb, $key, $value, $step, $first, $last) === false) { break; } } if ($last) { break; } } } 

इसे इस्तेमाल करे:

 function children( &$parents, $parent, $selected ){ if ($parents[$parent]){ $list = '<ul>'; $counter = count($parents[$parent]); $class = array('first'); foreach ($parents[$parent] as $child){ if ($child['id'] == $selected) $class[] = 'active'; if (!--$counter) $class[] = 'last'; $list .= '<li class="' . implode(' ', $class) . '"><div><a href="]?id=' . $child['id'] . '" alt="' . $child['name'] . '">' . $child['name'] . '</a></div></li>'; $class = array(); $list .= children($parents, $child['id'], $selected); } $list .= '</ul>'; return $list; } } $output .= children( $parents, 0, $p_industry_id);