लूप के लिए सूचकांक में पहले तत्व को छोड़ने का स्पष्ट तरीका


9

मेरे पास एक लूप है जहां मुझे शून्य-आधारित सरणी में पहला तत्व छोड़ना होगा।

इनमें से कौन सा मेरा इरादा अधिक स्पष्ट रूप से दिखाता है?

for($i=1 ; $i < count(array) ; $i++){
    array[$i];
}

या

for($i=0+1 ; $i < count(array) ; $i++){
    array[$i];
}

28
न ही, $i=2-1बेहतर तरीका है। : /
यानिस

7
मैं शायद पहले विकल्प के लिए जाऊंगा और यह बताने के लिए एक टिप्पणी जोड़ूंगा कि पहले तत्व को क्यों छोड़ना है।
विंसेंट सवार्ड

3
क्लियरनेस वह है जिसका मैं लक्ष्य बना रहा हूं, मैंने प्रश्न संपादित किया। क्या यह कोई स्पष्ट है?
टॉमस ज़ुबरी

10
PHP का उपयोग नहीं करना बेहतर तरीका है।
बिल्ली

3
क्या PHP में फोरचेक निर्माण है? आप कर सकते हैं foreach ($i in range(1, count))(जो कुछ भी PHP में दिखता है)। या कुछ foreach ($item in array.skip(1))ऐसा जो एक C # व्यक्ति करता है।
usr

जवाबों:


23

मुझे दोनों से नफरत है।

किसने कहा कि आप जादू की संख्या का उपयोग कर सकते हैं? यदि आप 1 से ऑफसेट करने जा रहे हैं, तो हमें यह बताने के बारे में कि आप 1. की ऑफसेट पर कैसे शुरू कर रहे हैं, एक समान रूप से जादू शून्य जोड़ना मेरे लिए कुछ भी नहीं बताता है।

क्या यह पेलोड ऑफसेट है? क्या यह कुछ पास्कल स्ट्रिंग है जिसे आप अशक्त सी स्ट्रिंग में परिवर्तित कर रहे हैं? कृपया हमें बताएं कि क्या चल रहा है।

क्षमा करें, लेकिन मैंने अपने करियर के बहुत से व्यर्थ रहस्यों को इस तरह बर्बाद कर दिया है और उनके लिए मेरा धैर्य पतला हो गया है। क्या वास्तव में बहुत पूछने के लिए एक सभ्य नाम वाला चर है ?

सभ्य नाम से मेरा मतलब एक ऐसा नाम है जो बताता है कि हम पहले तत्व को छोड़ रहे हैं। ऐसा कुछ नहीं जो केवल कहता है कि हम पहले तत्व को छोड़ रहे हैं। 1 ने मुझे बताया कि यह अपने आप है।


20
0 और 1 मैजिक नंबर नहीं हैं।
189 बजे user949300

19
@ user949300 ओह, वे निश्चित रूप से यहाँ हैं। वे बस संख्या है कि कभी कभी जादुई नहीं हैं। सिर्फ इसलिए कि 2 हमेशा एक जादू की संख्या है इसका मतलब यह नहीं है कि 1 कभी भी जादू की संख्या नहीं है। जादू गायब अर्थ से आता है। 1 ऑफसेट पर शुरू होने वाली हेक का यहां क्या मतलब है? यहाँ 0 जोड़ने से क्या अच्छा है? अरे हाँ ये संख्या निश्चित रूप से यहाँ जादुई है। मैं पिक्सी धूल को उनमें से टपकते हुए देख सकता हूं।
कैंडिड_ऑरेंज

4
ज़रूर, मैं अपने static final int LONELIEST_NUMBER = 1सभी जावा कोड में परिभाषित करना शुरू कर दूंगा। :-) उस ने कहा, आगे के विचार पर मैं आपके उत्तर को अस्वीकार करना चाहूंगा लेकिन जब तक आप इसे संपादित नहीं कर सकते। मूर्खतापूर्ण SO नियम?
user949300

6
@ ईको: यदि कोई स्पष्टीकरण नहीं है कि लूप दूसरे तत्व पर क्यों शुरू होता है, तो यह वास्तव में गारंटी है कि कुछ रखरखाव प्रोग्रामर पहले तत्व पर शुरू करने के लिए लूप को बदल देगा। इसीलिए अंक 1 इस संदर्भ में एक जादुई संख्या है।
बार्ट वैन इनगेन शेनौ

2
@BartvanIngenSchenau मैंने माना कि संदर्भ के भीतर एक तुरंत दिखाई देने वाला कारण होगा। अपने पूर्ववर्तियों के साथ तत्वों की तुलना करना (जैसा कि मैंने 1 पर शुरू करने के लिए सबसे अधिक बार उपयोग होने वाला मामला माना था - और मैं यहां कोई उपयोगी निरंतर नाम देखने में विफल रहा हूं)। यदि पहले तत्व का कुछ अति-विशेष अर्थ है, तो डिज़ाइन को तोड़ा जा सकता है, और उस सूचकांक का नामकरण करने से बेहतर सुधार होना चाहिए। मैं यह नहीं कहता कि यहाँ एक चर पेश करने का कोई कारण नहीं है। यह सिर्फ इतना है कि मुझे लगता है कि वे मामले बहुत दुर्लभ हैं (या शायद केवल होना चाहिए)।
Eiko

12

संक्षिप्त उत्तर: पहला विकल्प बेहतर है।

दूसरा विकल्प सिर्फ शोर जोड़ता है। यह बहुत कम संभावना नहीं है कि 0 + 1 पाठक को यह समझने में मदद करता है कि यह 0 हो सकता है, लेकिन यह 1. बहुत अधिक संभावना है कि वह एक संक्षिप्त क्षण को हैरान कर देगा और लूप के बारे में क्या विचलित होगा। विशेष रूप से एक ऐसी भाषा में जहां सभी सरणियाँ 0 से शुरू होती हैं।

जैसा कि अन्य उल्लेख किया गया है, यदि आप इस तथ्य पर जोर देना चाहते हैं कि लूप 1 से शुरू होता है, न कि 0 से, बस एक टिप्पणी जोड़ें।


10

हमें यह मत बताइए कि आप पहले आइटम को छोड़ रहे हैं - हम उसे देख सकते हैं। जो स्पष्ट नहीं है वह क्यों है । तो .. अगर यह संदर्भ से स्पष्ट नहीं है, तो हमें बताएं:

// array[0] is just a header
for($i=1 ; $i < count(array) ; $i++){
    array[$i];
}

या, यदि आप टिप्पणी-प्रतिकूल हैं, तो कुछ इस तरह हैं:

$lastHeaderIndex = 0;
for($i = $lastHeaderIndex + 1 ; $i < count(array) ; $i++){
    array[$i];
}

भाषा कैसे काम करती है यह याद दिलाने के लिए टिप्पणियों और प्रवंचनाओं का उपयोग न करें


6

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

for($i=1 ; $i < count(array) ; $i++){
    array[$i-1]=array[$i];
}

कोई स्पष्टीकरण या "0 + 1" निर्माण की आवश्यकता नहीं होगी यह स्पष्ट करने की आवश्यकता है कि लूप 0 के बजाय 1 पर क्यों शुरू होता है।

हालांकि, यदि लूप के अंदर कोड इस तरह के स्पष्ट तरीके से कारणों की व्याख्या नहीं करता है (शायद array[0]इसका एक विशेष अर्थ है और शेष तत्वों की तुलना में अलग तरीके से निपटा जाना चाहिए), तो एक व्याख्या टिप्पणी जोड़ें। लेकिन ऐसा करने से पहले, दो बार सोचें कि क्या आप array[0]इस विशेष अर्थ से बच सकते हैं , और आसपास के कोड को पुनर्गठित कर सकते हैं , जो शायद बेहतर विकल्प होगा।


आपके उदाहरण कोड जैसी स्थितियों में मैं चर "वनबेडइंडेक्स" या "जीरोबेडइंडेक्स" नाम देना पसंद करता हूं। हालांकि उस कार्य के लिए और भी अधिक विशिष्ट कुछ बेहतर होगा।
user949300

5

# 2 विकल्प कभी नहीं देखा, लेकिन मुझे यह पसंद है। क्यों? विकल्प # 1 के साथ मुझे आश्चर्य होगा कि यदि प्रोग्रामर भूल गया कि सरणियाँ 0. पर शुरू होती हैं। विकल्प # 2 यह स्पष्ट करता है कि वे जानबूझकर 1 से शुरू कर रहे हैं।

उस ने कहा, किसी भी मामले में सबसे अच्छा है कि आप टिप्पणी क्यों छोड़ रहे हैं।

या, यदि आप आसानी से वर्णन कर सकते हैं कि आप एक पर क्यों शुरू कर रहे हैं, एक स्थिरांक का उपयोग करें। उदाहरण के लिए, यदि कमांड लाइन के तर्कों को देखें, तो कुछ ऐसा है

define ('FIRST_REAL_ARGUMENT', 1);
for ($i=FIRST_REAL_ARGUMENT; ...)

व्यक्तिगत रूप से, मैं शायद YMMV के बजाय एक टिप्पणी का उपयोग करूंगा।


मैं कहूंगा कि उन परिवेशों के बाहर जहां आप शुरुआती लोगों के साथ काम कर रहे हैं, मैंने कभी भी सहकर्मियों के मुद्दे को नहीं भुलाया है कि सरणियों को शून्य पर शुरू करना। मैं देख रहा था कि अगर आपका काम भी MATLAB जैसी भाषा का उपयोग करता है, लेकिन ज्यादातर वातावरण में, मैं मान सकता हूं कि प्रोग्रामर को पता था कि वे क्या कर रहे हैं। और बिल्ली, 1 पर एक लूप शुरू करना बहुत ही सामान्य है। किसी चीज़ के पहले तत्व को छोड़ने के लिए कुछ कारण हैं।
कैट

@Kat भविष्य के पाठकों के लिए यह कारण स्पष्ट होना चाहिए। मैं यह मानकर चलूंगा कि भविष्य का प्रोग्रामर नहीं जानता कि वह क्या कर रहा है।
A1rPun

2

मुझे लगता है कि किसी को भी पहले एक उलझन होगी। हम सभी को यह करना पड़ा है। इतना कि दूसरे को भ्रमित करने की संभावना अधिक है। "वहाँ एक 0+ क्यों है? क्या उन्होंने किसी तरह + ऑपरेटर को ओवरराइड किया है?"

एक सभ्य संकलक वैसे भी दूसरे को पहले में बदल देगा, लेकिन ऐसा लगता है कि आप PHP का उपयोग कर रहे हैं, जिसकी व्याख्या की जाती है। इसलिए हर बार जब दुभाषिया उस लूप से टकराता है, तो उसे वास्तव में 0 और 1 जोड़ना होगा। कोई बड़ी बात नहीं है, लेकिन दुभाषिया काम क्यों करता है?


2

एक चर का उपयोग करें जो प्रारंभ बिंदु की व्याख्या करता है।

आपको " शून्य-आधारित सरणी में पहला तत्व छोड़ना होगा ", इसलिए उदाहरण के लिए:

skipFirstElement = 1;

for($i=$skipFirstElement ; $i < count(array) ; $i++){
    array[$i];
}

6
मुझे एक चर का उपयोग करना पसंद है लेकिन मुझे इस नाम से नफरत है। यह स्पष्ट नहीं करता है कि आप पहले तत्व को छोड़ क्यों रहे हैं। एक 1 मुझे वैसे भी बताता है। क्या अच्छा है एक चर जिसका नाम बदल जाने पर उसे बदलने की आवश्यकता होती है? मुझे पता है कि ओपी ने हमें कोई सुराग नहीं दिया कि ऐसा अच्छा नाम चुनने के लिए जिसे आपको एक कारण बनाना होगा। एक बेहतर नाम के बिना मैं 1 बैक चाहता था।
कैंडिड_ऑरेंज

@CandiedOrange मैं आपसे सहमत हूं कि परिवर्तनशील नाम अधिक सार्थक होना चाहिए, लेकिन समस्या के रूप में यह प्रस्तुत किया गया है कि वह यह नहीं समझाता है कि वह पहले मूल्य को क्यों छोड़ना चाहता है। मेरा कहना है, मैं सिर्फ एक उदाहरण देता हूं, लेखक एक ऐसा नाम चुन सकता है जो उसके लिए सबसे अच्छा हो।
catta

कृपया इस तरह मत सिखाओ। यह काफी भ्रामक है। कई कोडर्स के लिए सबसे आसान नाम वे तक पहुँच सकते हैं ताकि वे कोड को समझने के लिए कठिन लेखन में वापस आ सकें। गंभीरता से, मैं इसके बजाय 1 से निपटना चाहूंगा।
कैंडिड_ओरेंज

1
//We are skipping the first element because...    
if ($i==0)  
{    continue;      } 

यदि कोई शून्य पर शुरू होने वाले सभी छोरों के साथ जुनूनी है, तो आप जारी बयान का उपयोग कर सकते हैं। टिप्पणी जोड़ें कि आप सामान्य रूप से एक के बाद से क्यों स्किप कर रहे हैं।


2
इस विकल्प के साथ समस्या का मतलब है कि हम हर एक तत्व के लिए इसका मूल्यांकन करने जा रहे हैं, एन अतिरिक्त तुलना को लूप में जोड़ते हैं, जबकि बस पहले एक को किसी अन्य विधि के माध्यम से छोड़ देते हैं (सरणी को शिफ्ट करना, i = 1 से शुरू करना, जो भी हो ) का मतलब केवल वह कार्य करना है जिसकी आपको आवश्यकता है।
केविन फी

3
@ केविनफि अगर आप बड़े पैमाने पर सरणियों के साथ काम नहीं कर रहे हैं, तो मैं कहूंगा कि यह उपमा तुलना एक मुद्दा नहीं है। और मुझे if first then skipएक टिप्पणी के साथ गवाह की तरह काफी पसंद है । फिर भी संदर्भ के बिना कोई भी समाधान "सर्वश्रेष्ठ" नहीं है
इवान पिंटर

-2

मैं क्या करूँगा पहले तत्व को पाशन से पहले हटा दें। यदि आपको आवश्यकता हो तो एक नई सारणी बनाएँ। एक टिप्पणी में स्पष्ट करें कि आप ऐसा क्यों कर रहे हैं। और फिर बस एक साधारण फोरचेक करें।

$arrayCopy = $array; // in case you don't want to touch the original array
array_shift($arrayCopy); // removing first element because of X reason.
foreach($arrayCopy => $element) { 
    // do stuff
}

इस तरह आपका इरादा पूरी तरह स्पष्ट है।

आगे स्पष्ट करने के लिए आप चीजों को स्पष्ट करने के लिए एक उपयुक्त नाम के साथ एक विधि में कोड को लपेट सकते हैं।

function doStuffToAllButTheFirst($array) { // this copies the original array, so there are no sideffects
    array_shift($array);
    foreach($array => $element) { // do stuff }  
}

हालाँकि यह सब अब भी गायब है। आप तत्वों के साथ क्या करना चाहते हैं? क्या आप नई सरणी लौटाएंगे? क्या आपको अपने बाद मूल और नए सरणी की परवाह है doStuff()?

वैसे भी, यहाँ कोई स्पष्ट उत्तर नहीं है, और कोड को पठनीय बनाने का निर्णय लेना संदर्भ पर बहुत निर्भर करता है।


1
मुझे यह पसंद है क्योंकि मुझे अब अनुक्रमित से निपटने की आवश्यकता नहीं है, जो हमेशा एक प्लस है।
टॉमस जुबरी

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

1
और क्या कारण है कि हम 1 से शुरू कर रहे हैं, क्योंकि हम $array[$i-1] = $array[$i]@ DocBrown के उत्तर के अनुसार ऐसा ही कुछ कर रहे हैं ?
केविन फी

1
यह मुझे भयानक लगता है। (सभी 1केविन ली की टिप्पणी देखें) के लिए सभी सामान्य उपयोग के मामलों को हल करने में अक्षमता, दुष्प्रभाव और अक्षमता के अलावा , यह कोड को बिल्कुल भी स्पष्ट नहीं करता है। पाठक को array_shift को समझना चाहिए, यह क्या करता है, यह कैसे काम करता है। शायद कोड की यह रेखा एक बग है? यह सरणी को संशोधित करता है या एक नया लौटाता है? क्या यह एक तत्व सम्मिलित करता है या एक को हटाता है? यह सूचकांक बदलता है या नहीं? मैं यह देखने में विफल हूं कि एक-आधारित लूप का उपयोग करना उस फ़ंक्शन में एक बहुत बड़ा सुधार नहीं होगा (और इसका नाम दिया गया, तुरंत समझ में आता है)।
Eiko

1
इन सवालों के जवाब संदर्भ पर अत्यधिक निर्भर हैं। और जैसा कि दक्षता के लिए, मैं किसी भी दिन के लिए एक ओवरचेक ले जाऊंगा ... अधिकांश मामलों में कोई भी प्रदर्शन अंतर अदृश्य के पास है।
इवान पिंटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.