2008-08-22 5 views
6

के बीच का अंतर यह PHP के बारे में है लेकिन मुझे कोई संदेह नहीं है कि कई टिप्पणियां अन्य भाषाओं पर लागू होंगी।लूप

बस शब्दों में कहें, PHP के लिए विभिन्न प्रकार के लूप में अंतर क्या हैं? क्या दूसरों की तुलना में तेज़/बेहतर है या क्या मुझे बस सबसे पठनीय लूप में रखा जाना चाहिए?

for ($i = 0; $i < 10; $i++) 
{ 
    # code... 
} 


foreach ($array as $index => $value) 
{ 
    # code... 
} 


do 
{ 
    # code... 
} 
while ($flag == false); 
+2

प्रदर्शन बहुत मुश्किल से ही एक के चुनाव में एक प्रेरित कारक है पाश। –

उत्तर

10

लूप के लिए और जबकि लूप प्रवेश स्थिति लूप हैं। वे पहले स्थिति का मूल्यांकन करते हैं, इसलिए लूप से जुड़े कथन ब्लॉक को तब भी नहीं चलाया जाएगा जब स्थिति

लूप ब्लॉक के लिए इसके अंदर दिए गए बयान 10 गुना चलेंगे, $ i का मूल्य 0 होगा 9;

for ($i = 0; $i < 10; $i++) 
{ 
     # code... 
} 

यही बात है, जबकि पाश के साथ किया:

$i = 0; 
while ($i < 10) 
{ 
    # code... 
    $i++ 
} 

करते-करते हुए पाश से बाहर निकलें शर्त पाश है।यह एक बार निष्पादित करने के लिए गारंटी है, तो यह ब्लॉक

do 
{ 
     # code... 
} 
while ($flag == false); 

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

foreach ($array as $index => $value) 
{ 
     # code... 
} 

आप इस

while (current($array)) 
{ 
    $index = key($array); // to get key of the current element 
    $value = $array[$index]; // to get value of current element 

    # code ... 

    next($array); // advance the internal array pointer of $array 
} 

और अंत में की तरह है, जबकि पाश के साथ एक ही बात कर सकता है: The PHP Manual अपने दोस्त :)

0

मैं जब एक पारंपरिक (अनुक्रमित?) सरणी और foreach पाश जब एक साहचर्य सरणी के साथ काम से अधिक पुनरावृत्ति पहले लूप का उपयोग करें। यह सिर्फ प्राकृतिक लगता है और कोड प्रवाह में मदद करता है और मेरी राय में, और अधिक पठनीय हो सकता है। ऐसा करने के लिए ... जबकि loops, मैं उन लोगों का उपयोग करता हूं जब मुझे सिर्फ एक सरणी के माध्यम से फ्लिप करने की आवश्यकता होती है।

हालांकि, मुझे किसी भी प्रदर्शन लाभ की जानकारी नहीं है।

0

प्रदर्शन किसी भी मामले में काफी बेहतर नहीं है। हालांकि पुनरावृत्ति से अधिक जटिल कार्यों के लिए उपयोगी है, लेकिन for और while कार्यात्मक रूप से समकक्ष हैं।

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

0

फ़ोरैच लूप के साथ, मूल सरणी की एक प्रति मेमोरी में अंदर उपयोग करने के लिए बनाई गई है। आपको बड़े ढांचे पर उनका उपयोग नहीं करना चाहिए; लूप के लिए एक सरल विकल्प बेहतर विकल्प है। आप इस तरह के एक बड़े गैर संख्यानुसार अनुक्रमित संरचना पर अधिक कुशलता से थोड़ी देर के पाश का उपयोग कर सकते हैं:

while(list($key, $value) = each($array)) { 

लेकिन उस दृष्टिकोण एक सरल छोटी संरचना के लिए विशेष रूप से बदसूरत है।

while लूप में बेहतर धाराओं के माध्यम से पाशन के लिए उपयुक्त हैं, या आप बहुत बार PHP में देखते हैं कि निम्न उदाहरण में:

while ($row = mysql_fetch_array($result)) { 

लगभग सभी समय अलग छोरों परस्पर विनिमय कर रहे हैं, और यह आ जाएगा की या तो ए) दक्षता, या बी) स्पष्टता।

यदि आप विभिन्न प्रकार के लूपों की दक्षता व्यापार-बंद जानते हैं, तो हाँ, अपने मूल प्रश्न का उत्तर देने के लिए: सबसे साफ दिखने वाले व्यक्ति का उपयोग करें।

1

यह CS101 है, लेकिन और कोई नहीं यह उल्लेख किया गया है क्योंकि के लिए एक से ज्यादा उपभोक्ता है, जबकि छोरों कोड ब्लॉक से पहले उनकी हालत मूल्यांकन, और कोड ब्लॉक के बाद मूल्यांकन करते समय, तो स्थिति के बावजूद, कम-से-कम लूप को कम से कम एक बार अपने कोड ब्लॉक को चलाने की गारंटी दी जाती है।

0

प्रत्येक पाशन निर्माण एक अलग ही उद्देश्य।

के लिए - इसका उपयोग किसी विशिष्ट संख्या के पुनरावृत्ति के लिए लूप के लिए किया जाता है।

foreach - इसका उपयोग संग्रह में सभी मानों के माध्यम से लूप करने के लिए किया जाता है।

जबकि - जब तक आप किसी शर्त को पूरा नहीं करते हैं तब तक इसका उपयोग लूप के लिए किया जाता है।

तीन में से, "जबकि" अधिकतर स्थितियों में सबसे अच्छा प्रदर्शन प्रदान करेगा। बेशक, यदि आप निम्न की तरह कुछ करते हैं, तो आप मूल रूप से "फॉर" लूप को फिर से लिख रहे हैं (जो सी # में थोड़ा अधिक प्रदर्शनकारी है)।

$count = 0; 
do 
{ 
    ... 
    $count++; 
} 
while ($count < 10); 

उनके सभी के पास बुनियादी बुनियादी उद्देश्यों हैं, लेकिन इन्हें कुछ हद तक भी इस्तेमाल किया जा सकता है। यह पूरी तरह से उस विशिष्ट समस्या पर निर्भर करता है जिसे आप हल करने का प्रयास कर रहे हैं।

1

@brendan:

लेख आपको उद्धृत गंभीरता से पुरानी हो चुकी है और जानकारी सिर्फ सादा गलत है। खासकर आखिरी बिंदु (forforeach के बजाय) भ्रामक है और लेख में दी गई औचित्य अब .NET के आधुनिक संस्करणों पर लागू नहीं होती है।

हालांकि यह सच है कि IEnumerator आभासी कॉल का उपयोग करता है, ये वास्तव में एक आधुनिक कंपाइलर द्वारा रेखांकित किया जा सकता है। इसके अलावा, .NET अब जेनेरिक जानता है और दृढ़ता से टाइप किए गए गणक।

वहां बहुत सारे प्रदर्शन परीक्षण हैं जो साबित करते हैं कि for आमतौर पर foreach से अधिक तेज़ नहीं है। Here's an example

+0

लिंक मर चुका है। – edigu

0

फ़ोरैच लूप के साथ, मूल सरणी की एक प्रति अंदर उपयोग करने के लिए स्मृति में बनाई गई है।

पूर्वानुमान अच्छा है, लेकिन एक महत्वपूर्ण चेतावनी है: आप उस समेकित संशोधित नहीं कर सकते जिसे आप पुन: सक्रिय कर रहे हैं।

उन दोनों ने एक समस्या नहीं होगा यदि आप मान के बजाय संदर्भ द्वारा पारित करेंगे:

foreach ($array as &$value) { 

इस पीएचपी के बाद अनुमति दी गई मुझे लगता है कि 5.

0

जब तक पहुँचने के तत्वों स्पष्टता के लिए एक सरणी, जब भी संभव हो मैं एक foreach का उपयोग करेंगे, और केवल अगर आप वास्तविक सूचकांक मानों की आवश्यकता है (उदाहरण के लिए, एकाधिक सरणी में एक ही सूचकांक) की आवश्यकता है। यह टाइपो गलतियों के मौके को भी कम करता है क्योंकि लूप इसे सब कुछ आसान बनाते हैं। आम तौर पर, पीएचपी प्रदर्शन के बारे में चिंता करने की जगह नहीं हो सकती है। और आखिरी लेकिन कम से कम नहीं, के लिए और भविष्यवाणी के पास (या होना चाहिए; मैं एक PHP-er नहीं हूं) वही बिग-ओ टाइम (ओ (एन)) ताकि आप संभावित रूप से स्मृति उपयोग के बारे में थोड़ी सी मात्रा में देख रहे हों या समय में मामूली स्थिर या रैखिक हिट।