লুপের উপর ভিত্তি করে একটি সূচকে প্রথম উপাদানটি এড়িয়ে যাওয়ার পরিষ্কার উপায়


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
পিএইচপি ব্যবহার না করা সর্বোত্তম উপায়।
বিড়াল

3
পিএইচপি এর একটি পূর্বাচ নির্মাণ আছে? আপনি করতে পারেন foreach ($i in range(1, count))(পিএইচপি-তে যা কিছু লাগে)। বা এর মতো কিছু foreach ($item in array.skip(1))যা কোনও # সি ব্যক্তি কী করবে।
usr ডিরেক্টরির

উত্তর:


23

আমি উভয়কে ঘৃণা করি।

কে বলেছে আপনি যাদু নম্বর ব্যবহার করতে পারবেন? আপনি যদি ১ এর অফসেটে শুরু করতে যাচ্ছেন তবে কীভাবে আমাদের অফসেটে শুরু করছেন তা আমাদের বলার বিষয়ে। ১. সমান ম্যাজিক শূন্য যুক্ত করা আমার কাছে কিছুই ব্যাখ্যা করে না।

এটি কি পেডলোড অফসেট? আপনি কি নাল টার্মিনেটেড সি স্ট্রিংয়ে রূপান্তর করছেন এটি এমন কিছু পাস্কাল স্ট্রিং? কী চলছে তা আমাদের বলুন।

দুঃখিত, তবে আমি আমার ক্যারিয়ারের বেশিরভাগ সময় নষ্ট করে যাচ্ছি এর অর্থহীন রহস্যগুলি এবং এর জন্য আমার ধৈর্য পাতলা হয়ে গেছে। কি একটি শালীন নামের সঙ্গে একটি পরিবর্তনশীল সত্যিই অনেক জিজ্ঞাসা করার?

শালীন নাম বলতে আমি এমন একটি নাম বোঝাই যা ব্যাখ্যা করে যে আমরা প্রথম উপাদানটি কেন এড়িয়ে চলেছি। এমন কিছু নয় যা কেবল বলে যে আমরা প্রথম উপাদানটি এড়িয়ে চলেছি। ১ জন আমাকে জানিয়েছিল যে এটি নিজস্ব।


20
0 এবং 1 ম্যাজিক সংখ্যা নয়।
user949300

19
@ user949300 ওহ তারা অবশ্যই এখানে আছে। এগুলি কেবল এমনই সংখ্যা যা মাঝে মাঝে যাদুকরী হয় না। 2 যেহেতু 2 সবসময় একটি ম্যাজিক সংখ্যা থাকে তার অর্থ এই নয় যে 1 কখনই যাদু সংখ্যা নয়। ম্যাজিক আসল অর্থ থেকে আসে। 1 টি অফসেটে শুরু হ্যাকের অর্থ এখানে কী? এখানে 0 যুক্ত করে ভাল কি হয়? ওহ হ্যাঁ এই সংখ্যাগুলি এখানে অবশ্যই যাদুকরী। আমি পিক্সির ধুলো সেগুলি থেকে সরে যেতে দেখতে পাচ্ছি।
candied_orange

4
অবশ্যই, আমি static final int LONELIEST_NUMBER = 1আমার সমস্ত জাভা কোডে সংজ্ঞা দেওয়া শুরু করব । :-) এটি বলেছিল, আরও ভাবিতে আমি আপনার উত্তরটি অগ্রাহ্য করতে চাই তবে আপনি এটি সম্পাদনা না করে পারতে পারবেন না। বোকা তাই নিয়ম?
user949300

6
@ আইকো: লুপটি দ্বিতীয় উপাদান থেকে কেন শুরু হয় সে সম্পর্কে যদি কোনও ব্যাখ্যা না থাকে তবে এটি কার্যত গ্যারান্টিযুক্ত যে কিছু রক্ষণাবেক্ষণ প্রোগ্রামার প্রথম উপাদানটিতে লুপটি পরিবর্তন করবে। এজন্য অঙ্ক 1 এই প্রসঙ্গে একটি ম্যাজিক নম্বর।
বার্ট ভ্যান ইনজেন শেহেনো

2
@ বার্টওয়ানআইগেনচেনা আমি ধরে নিয়েছি যে প্রসঙ্গে এই মুহুর্তে তত্ক্ষণাত্ দৃশ্যমান কারণ থাকবে। পূর্বসূরীদের সাথে উপাদানগুলির তুলনা করার মতো (যা আমি মনে করি 1 থেকে শুরু হওয়া সবচেয়ে ঘন ঘন ব্যবহারের কেস - এবং আমি এখানে কোনও কার্যকর ধ্রুবক নাম দেখতে ব্যর্থ হই)। যদি প্রথম উপাদানটির কিছু অতি-বিশেষ অর্থ থাকে তবে নকশাটি ভেঙে যেতে পারে এবং সেই সূচকের নামকরণের চেয়ে আরও ভাল সংশোধন করা উচিত। আমি বলি না যে এখানে কোনও ভেরিয়েবল প্রবর্তনের কারণ নেই। এটি কেবলমাত্র আমি মনে করি যে এই ঘটনাগুলি খুব বিরল (বা সম্ভবত কেবল হওয়া উচিত)।
ইকো

12

সংক্ষিপ্ত উত্তর: প্রথম বিকল্পটি আরও ভাল।

দ্বিতীয় বিকল্পটি কেবল শব্দ যোগ করে adds 0 + 1 পাঠককে বুঝতে বুঝতে সহায়তা করে যে এটি 0 হতে পারে তবে এটি 1 very এটি খুব কমই সম্ভাবনা রয়েছে uch বিশেষত এমন ভাষায় যেখানে সমস্ত অ্যারে 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]এই বিশেষ অর্থটি এড়াতে পারেন এবং পার্শ্ববর্তী কোডটি পুনর্গঠন করতে পারেন তবে এটি সম্ভবত আরও ভাল বিকল্প হতে পারে।


আপনার উদাহরণ কোডের মতো পরিস্থিতিতে আমি ভেরিয়েবলগুলির নাম "ওয়ানবেসড ইন্ডেক্স" বা "জিরোবেসড ইনডেক্স" রাখতে চাই। যদিও এই কাজের জন্য আরও নির্দিষ্ট কিছু আরও ভাল হবে better
user949300

5

বিকল্প # 2 কখনও দেখেনি, তবে আমি এটি পছন্দ করি। কেন? # 1 বিকল্পের সাথে আমি ভাবছি যদি প্রোগ্রামার ভুলে যায় যে অ্যারেগুলি 0 থেকে শুরু হয় O বিকল্প # 2 এটি আরও পরিষ্কার করে তোলে যে তারা ইচ্ছাকৃতভাবে 1 থেকে শুরু করছে।

এটি বলেছিল যে, উভয় ক্ষেত্রেই কেন আপনি উপাদানটি এড়িয়ে যাচ্ছেন তা একটি মন্তব্য যুক্ত করুন।

অথবা, আপনি কেন এক থেকে শুরু করছেন তা যদি আপনি সহজেই বর্ণনা করতে পারেন তবে একটি ধ্রুবক ব্যবহার করুন। উদাহরণস্বরূপ, যদি কমান্ড লাইন আর্গুমেন্টগুলি তাকান, তবে এর মতো কিছু

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

ব্যক্তিগতভাবে, আমি সম্ভবত পরিবর্তে একটি মন্তব্য ব্যবহার করব, ওয়াইএমএমভি।


আমি বলব যে পরিবেশগুলির বাইরে যেখানে আপনি প্রাথমিকের সাথে কথা বলছেন, সহকর্মীরা কখনও ভুলে যাবেন না যে অ্যারেগুলি শূন্য থেকে শুরু হয়। আপনার কাজটিও ম্যাটল্যাবের মতো কোনও ভাষা ব্যবহার করে থাকলে আমি এটি ঘটতে দেখেছি তবে বেশিরভাগ পরিবেশে, আমি ধরে নেব যে প্রোগ্রামারটি তারা কী করছে তা জানত। এবং হেক, 1 এ একটি লুপ শুরু করা খুব সুন্দর রঙিন। কোনও কিছুর প্রথম উপাদানটি এড়িয়ে যাওয়ার বেশ কয়েকটি কারণ রয়েছে।
কাট

@ কেট সেই কারণটি ভবিষ্যতের পাঠকদের জন্য পরিষ্কার হওয়া দরকার। আমি বরং ধরে নেব যে কোনও ভবিষ্যত প্রোগ্রামার জানেন না যে এটি কী করছে।
আরপুন

2

আমার সন্দেহ যে প্রথমটি দ্বারা যে কেউ বিভ্রান্ত হবে। আমাদের সকলকে এটি করতে হয়েছিল। এত বেশি যে দ্বিতীয়টি বিভ্রান্ত হওয়ার সম্ভাবনা অনেক বেশি। "সেখানে 0+ কেন আছে? তারা কি + কোনওভাবে অপারেটরকে ওভাররাইড করেছিল?"

একটি শালীন সংকলক দ্বিতীয়টিকে যেভাবেই হোক প্রথমটিতে রূপান্তরিত করবে, তবে দেখে মনে হচ্ছে আপনি পিএইচপি ব্যবহার করছেন, যা ব্যাখ্যা করা হয়েছে। সুতরাং প্রতিবার অনুবাদক সেই লুপটিকে আঘাত করলে এটি আসলে 0 এবং 1 যুক্ত করতে চলেছে বড় কথা নয়, তবে কেন দোভাষীকে কাজটি করতে হবে?


2

প্রারম্ভিক পয়েন্টটি ব্যাখ্যা করে এমন একটি চলক ব্যবহার করুন।

আপনাকে " শূন্য-ভিত্তিক অ্যারেতে প্রথম উপাদানটি এড়িয়ে চলতে হবে ", সুতরাং উদাহরণস্বরূপ:

skipFirstElement = 1;

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

6
আমি একটি পরিবর্তনশীল ব্যবহার করতে চাই তবে আমি এই নামটি ঘৃণা করি। আপনি কেন প্রথম উপাদানটি এড়িয়ে যাচ্ছেন তা এটি ব্যাখ্যা করে না। এ 1 আমাকে যেভাবেই হোক tells ভেরিয়েবলের মূল্য পরিবর্তন হওয়ার সাথে সাথে এর নাম পরিবর্তন করার দরকার কী? আমি জানি ওপি আমাদের কোনও কারণ দেয়নি কেন একটি ভাল নাম বাছাই করার জন্য আপনাকে একটি কারণ তৈরি করতে হবে। এর চেয়ে ভাল নাম না থাকলে আমার কাছে 1 পিছনে থাকত।
candied_orange

@ ক্যান্ডিওডআরেঞ্জ আমি আপনার সাথে একমত হই যে পরিবর্তনশীল নামটি আরও অর্থবহ হওয়া উচিত, তবে সমস্যাটি যেমনটি উপস্থাপিত হয়েছে তা কেন তিনি প্রথম মানটি এড়িয়ে যেতে চান তা ব্যাখ্যা করে না। আমার বক্তব্যটি হল, আমি কেবল একটি উদাহরণ দিই, লেখক একটি নাম চয়ন করতে পারেন যা তার পক্ষে সবচেয়ে ভাল।
catta

দয়া করে এভাবে শিখিয়ে দিবেন না। এটি যথেষ্ট বিভ্রান্তিকর। অনেক কোডারের কাছে তারা সহজ নামটি পৌঁছে যাবে যাতে তারা কোড বোঝার জন্য কঠিন লেখায় ফিরে যেতে পারে। সিরিয়াসলি, আমি এর চেয়ে 1 এর সাথে ডিল করব।
candied_orange

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

শূন্য থেকে শুরু করে সমস্ত লুপের সাথে যদি কেউ আবেশী হয় তবে আপনি একটি চালিয়ে যাওয়া বিবৃতি ব্যবহার করতে পারেন। আপনি সাধারণত যেহেতু এড়িয়ে যাচ্ছেন সে সম্পর্কে একটি মন্তব্য যুক্ত করুন one


2
এই বিকল্পটির সাথে সমস্যাটির অর্থ হ'ল আমরা প্রতিটি একক উপাদানের জন্য এটি মূল্যায়ন করব, লুপের সাথে n অতিরিক্ত তুলনা যুক্ত করব, যখন কেবল অন্য কোনও পদ্ধতির মাধ্যমে প্রথমটিকে এড়িয়ে যাব (অ্যারে স্থানান্তরিত, 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
}

এইভাবে আপনার উদ্দেশ্য পুরোপুরি পরিষ্কার clear

আরও স্পষ্ট করার জন্য আপনি জিনিসটিকে পরিষ্কার করার জন্য উপযুক্ত নাম দিয়ে কোনও পদ্ধতিতে কোডটি মোড়ানো করতে পারেন।

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]ডকব্রাউনের উত্তর অনুসারে আমরা 1-এ শুরু করার কারণটি হ'ল কারণ আমরা কিছু করছি বা এর মতোই কিছু করছি ?
কেভিন ফি

1
এটি আমার কাছে ভয়ঙ্কর বলে মনে হচ্ছে। সমস্ত অদক্ষতা, পার্শ্ব প্রতিক্রিয়া এবং বেশ সাধারণ ব্যবহারের কেসগুলি সমাধানের অক্ষমতার পাশাপাশি 1(কেভিন লির মন্তব্য দেখুন), কোডটি কোনওভাবেই পরিষ্কার করে না। পাঠককে অবশ্যই অ্যারে_শিফটটি বুঝতে হবে, এটি কী করে, কীভাবে এটি কাজ করে। কোডের এই লাইনটি কি বাগ? এটি অ্যারে সংশোধন করে বা কোনও নতুন ফিরিয়ে দেয়? এটি একটি উপাদান inোকানো বা একটি সরান? এটি সূচকগুলি পরিবর্তন করে না? ওয়ান-বেসড লুপ ব্যবহার করা কীভাবে সেই ফাংশনে বিশাল উন্নতি হবে না তা দেখতে আমি ব্যর্থ হয়েছি (এবং এর নাম দেওয়া হয়েছে, তাত্ক্ষণিকভাবে বোধগম্য)।
ইকো

1
এই প্রশ্নের উত্তরগুলি প্রসঙ্গে নির্ভর করে dependent এবং দক্ষতার হিসাবে, আমি যে কোনও দিনের জন্য একটি ভবিষ্যদ্বাণী নেব ... কোনও ক্ষেত্রে পারফরম্যান্সের পার্থক্য বেশিরভাগ ক্ষেত্রে অদৃশ্য হওয়ার কাছাকাছি।
ইভান পিন্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.