কেন এই কোডটি কেবল এ টু জেড অক্ষর মুদ্রণ করে না?


435
<?php
for ($i = 'a'; $i <= 'z'; $i++)
    echo "$i\n";

এই স্নিপেটটি নিম্নলিখিত আউটপুট দেয় (নিউলাইনগুলি স্পেস দ্বারা প্রতিস্থাপিত করা হয়):

abcdefghijklmnopqrstu vwxyz aa ab ac ad ae ab ah ai aj ak aar ar as at au av ax ay az ba bb bc bd be bf bg bh bi bij bk bl bm bn bp br br bs bt bu bv bvv বিডব্লিউ বিএক্স বাই বিজেএ সিএ সিবি সিসি সিডি সিই সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি সি ডি স ডু ডিভি ডিডাব্লু ডিএক্স ডিআই ডিজে ইয়া ইবি ইস এডি ই ই এফ যেমন উদাহরণ এহ এআই ইজ ই এল এল এন এন ইও এপি একি ই এস এস এট ইও ইও ইও প্রাক্তন ... টু ইয়জে


31
পিএইচপি সি নয়, এমনকি যদি সিনট্যাক্স আপনাকে বিপরীতে বোঝানোর চেষ্টা করে।
joni

3
এটি আমার জন্য খুব ছোট একটি পরিবর্তন নিয়ে কাজ করে: ($ i = 'a'; $ i! = 'আ'; $ i ++) cho প্রতিধ্বনি "$ i \ n"; }
পরাবাস্তব স্বপ্নগুলি

2
পিএইচপি সম্পর্কে মন্তব্যটি সি নয় - এটি ছিল সবচেয়ে উত্সাহী, উদাহরণ: সি: চর সি = 'এ'; পিএইচপি: এর মতো নয় $c = 'a';, বিন্দুটি হ'ল সিতে চরের ধরণ রয়েছে (অক্ষর 1 প্রতীক), তবে পিএইচপিতে নয়, যদি ইউ পিএইচপি বলি $c = 'a';- এর অর্থ এটি কেবল 1 টি অক্ষরের স্ট্রিং। এজন্য পিএইচপি-তে আপনি যথাযথভাবে 28 টি অক্ষর লুপ করতে পারবেন না। আমি আশা করি প্রত্যেক প্রোগ্রামার ম্যাথ অভ্যাসগুলি ভুলে না গিয়ে নিম্ন-স্তরের ভাষা এবং এর সাথে শক্তিশালী-টাইপিং শিখবে, যা তাদের আরও শক্তিশালী হতে সহায়তা করবে।
আর্থার কুশমান

বাহ যে সত্যিই দুর্দান্ত, তবে কেন এটি "জেড" এ থামেনি
প্রশান্ত বেন্দ্র

সাম্যতা ( ==বা !=) ব্যবহার করে প্রত্যাশিত শেষ-পয়েন্ট পাওয়ার কোনও উপায়ের জন্য সম্পর্কিত প্রশ্নের এই উত্তরটি দেখুন
আইএমএসওপি

উত্তর:


342

ডক্স থেকে :

পিএইচপি পার্লের সম্মেলন অনুসরণ করে যখন সি এর পরিবর্তে চরিত্রের ভেরিয়েবলগুলিতে গাণিতিক ক্রিয়াকলাপগুলি পরিচালনা করে।

উদাহরণস্বরূপ, পার্ল 'Z'+1রূপান্তরিত হয় 'AA', যখন সি তে 'Z'+1পরিণত হয় '['( ord('Z') == 90, ord('[') == 91)।

নোট করুন যে অক্ষর ভেরিয়েবলগুলি বাড়ানো যেতে পারে তবে হ্রাস করা যায় না এবং এমনকি কেবল সরল ASCII অক্ষর (অ্যাজ এবং এজেড) সমর্থিত।

মন্তব্যগুলি থেকে: -
এটিও লক্ষ করা উচিত যে<=এটি একটি অভিধান সংক্রান্ত তুলনা, তাই'z'+1 ≤ 'z'। (যেহেতু'z'+1 = 'aa' ≤ 'z'। তবে'za' ≤ 'z'এই প্রথম তুলনাটি মিথ্যা।)$i == 'z'উদাহরণস্বরূপ,কখনকাজ হবে তাভঙ্গ করা।

উদাহরণ এখানে


হাহ..এই পাগল! আমি সর্বদা ব্যবহার করেছি ord()তাই আমি এটি কখনই লক্ষ্য করিনি।
এমপেন

68
সম্পূর্ণতার জন্য, আপনার যুক্ত করা উচিত যে "<=" শব্দভাণ্ডারের তুলনা, সুতরাং 'z' + 1 ≤ 'z'। (যেহেতু 'z' + 1 = 'আআ''জ'। তবে 'zz'≤'z' প্রথমবারের তুলনাটি মিথ্যা।) উদাহরণস্বরূপ, যখন aking i == 'z' কাজ করবে তখন ব্রেকিং।
শ্রীভাত্সার

6
শ্রীভাতসার যেমন বলছেন, এটি তুলনাকারী, সমস্যাটি গাণিতিক নয়, ++ অপারেটরের দিকে মনোনিবেশ করবেন না
slp

10
@ শ্রীভাতসার: প্রকৃতপক্ষে, 'yz' + 1 = 'জা'। ব্যর্থ হওয়া প্রথম তুলনাটি হ'ল 'জা' <= 'জেড'
মিলান বাবুস্কভ

2
বলছি মন্তব্যের জন্য ধন্যবাদ! হ্যাঁ, কী বিন্দু যে 'aa'হয় lexicographically চেয়ে ছোট 'z', যে কেন লুপ চলতে থাকে। এর চেয়ে বেশি 'yz'হওয়ায় এটি বন্ধ 'za'হয়ে যায় zএই উদাহরণটি পরীক্ষা করুন ।
সিএমএস

123

কারণ একবার 'জেড' পৌঁছেছে (এবং এটি আপনার পরিসীমাটির মধ্যে একটি বৈধ ফলাফল, $ i ++ ক্রমানুসারে এটি পরবর্তী মানটিতে বৃদ্ধি করে), পরবর্তী মানটি 'আ' হবে; এবং বর্ণমালা অনুসারে, 'আ' <'জেড', সুতরাং তুলনাটি কখনই পূরণ হয় না

for ($i = 'a'; $i != 'aa'; $i++) 
    echo "$i\n"; 

55
এটি 'জেড' ++ = 'আ', তবে 'আ' <'জেড' এর থেকে আলাদা। এই যুক্তি খুব ভাল প্রবাহিত হয় না।
ম্যাথু ভাইনস

19
@ ম্যাথু: এগুলি বর্ণমালা করুন 'আ' প্রথমে আসবে, সুতরাং এটি 'z' এর চেয়ে কম "স্ট্রিং" হবে। লুপটি 'zz' এ শেষ হয় কারণ এটি বর্ণানুক্রমিকভাবে "এর চেয়ে বড়" (পরে আসে) 'z' হয়। এটি এই অর্থে অযৌক্তিক যে আপনি কোনও কিছু "বৃদ্ধি" করতে পারেন এবং কম মান পেতে পারেন, তবে এটি বর্ণানুক্রমিক অর্থে যৌক্তিক।
ওনাররেটিস

2
চরিত্র বৃদ্ধিকারী পার্ল লজিক (ডক্স থেকে সিএমএসের উদ্ধৃতি দেখুন)। 'আ' <'z' তুলনাটি স্ট্যান্ডার্ড স্ট্রিং তুলনা যুক্তি। অদ্ভুত নয়, একবার আপনি কীভাবে এটি ব্যবহার করবেন তা বুঝতে পারবেন ... উত্তরগুলি থেকে, অনেক লোক তা দেয় না।
মার্ক বাকের

5
@ ফিলারেরাথিস ওহ আমি নিশ্চিতভাবে বুঝতে পারি এটি কীভাবে কাজ করছে। আমি এটি একই সময়ে অদ্ভুত বলে মনে করি।
ম্যাথু ভাইনস

2
এটি আমার পক্ষে অবিশ্বাস্যরূপে কার্যকর, একই যৌক্তিক সিরিজ অনুসরণকারী এক্সেল কলামগুলির সাথে চারপাশে খেলা
মার্ক বেকার

97

অন্যদের উত্তর পোস্ট কোডটির পর্যবেক্ষণ আচরণ ব্যাখ্যা করে। আপনি যা চান তা করার একটি উপায় এখানে রয়েছে (এবং এটি ক্লিনার কোড, আইএমও):

foreach (range('a', 'z') as $i)
    echo "$i\n";

রেঞ্জ ফাংশন সম্পর্কে শ্রীভাতসার এর মন্তব্য / প্রশ্নের জবাবে : হ্যাঁ, এটি "ডান এন্ডপয়েন্ট" উত্পন্ন করে, অর্থাৎ ফাংশনটিতে পাস করা মানগুলি সীমার মধ্যে রয়েছে। উদাহরণস্বরূপ, উপরের কোড থেকে আউটপুটটি ছিল:

a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z

2
(পরিসীমা) কি সঠিক সমাপ্তিটি অন্তর্ভুক্ত করে? অন্যান্য ভাষার অভিজ্ঞতা থেকে, এটিও অপ্রত্যাশিত!
শ্রীভাতসার

1
@ শ্রীভাতসার: হ্যাঁ, পরিসর () "ডান" শেষ পয়েন্ট দেয়, আরও তথ্যের জন্য আমার সম্পাদিত উত্তর (এবং ফাংশনের লিঙ্কটি অনুসরণ করুন) দেখুন।
গ্রিনম্যাট

1
আমি কী বলতে পারি ... আরও পিএইচপি উন্মাদনা। :-) কোন রেঞ্জ () এইভাবে কাজ করে সে সম্পর্কে আমার জানা অন্য কোন ভাষা নেই। (অবশ্যই না, বলুন, হাস্কেল বা পাইথন।) ডিজকস্ট্র এ সম্পর্কে কিছু লিখেনি?
শ্রীভাতসারআর

10
পাগলতা পিএইচপি-র অসঙ্গতিতে রয়েছে। পরিসীমা ('এ', 'সিজেড') ++ ইনক্রিমেন্টারে সম্পূর্ণ ভিন্নভাবে কাজ করে এবং ফলস্বর অ্যারেতে তিনটি মান থাকবে: এ, বি এবং সি
মার্ক বাকের

35

অন্যরা ইতিমধ্যে বলেছে যে পিএইচপি কেন আপনার প্রত্যাশাটি প্রদর্শন করে না। আপনি যে ফলাফলটি পেতে চান তা এখানে কীভাবে পান:

<?php
for ($i = ord('a'); $i <= ord('z'); $i++)
    echo chr($i);
?>

2
অহেতুক। আপনি লুপের বিনষ্ট এ সব Ord (), শুধু সঠিক তুলনা করতে প্রয়োজন হবে না
মার্ক বেকার

2
+1 পিএইচপি-র আরও অধিকতর উদ্ভট বৈশিষ্ট্যের সাথে পরিচিত না হলে আরও অনেক বেশি বোধগম্য।
একাকী দিন

1
এটি স্ব-ডকুমেন্টিং কোডের একটি দুর্দান্ত উদাহরণ। এটি সহজেই বোধগম্য হয় অবিকল বি / সি এটি সাধারণ মান ব্যবহার করে এবং তারপরে অক্ষর হিসাবে চলকটি প্রদর্শন করে। সর্বাধিক মানের পরীক্ষার জন্য নিম্নলিখিতটি একবারে নির্ধারণ করা হলে লুপটি আরও কার্যকর হবে: "($ i = অর্ডার ('a')), $ সর্বোচ্চ = আদেশ ('জেড'); $ i <= $ সর্বাধিক; $ i ++) {"
slevy1

22

শুধু ব্যবহার range('a','z')করবেন না কেন ?


4

এই কোড ব্যবহার করে দেখুন। আমি মনে করি এই কোডটি আপনার পক্ষে সহায়ক হবে।

$alphas = range('A', 'Z');
foreach($alphas as $value){
    echo $value."<br>";
}

ধারাবাহিকভাবে 26 টি বর্ণ প্রদর্শন করুন।



2

এছাড়াও এটি ব্যবহার করা যেতে পারে:

for ($i = 'a'; $i <= 'z'; $i=chr(ord($i)+1))
    echo "$i\n";

2

পিএইচপি লুপিং অক্ষরের ফাংশন রয়েছে এবং একক অক্ষর অতিক্রম করতে পারে; বাকিগুলি এইভাবে করা হবে: আ আব এসি ... জেডজেড এবং আরও অনেক কিছু।

এটা চেষ্টা কর:

<?php
for ($i = 'a'; $i !== 'aa'; $i++)
    echo "$i\n";
?>

0

উপরের উত্তরগুলি কী চলছে সে সম্পর্কে অন্তর্দৃষ্টিপূর্ণ এবং আকর্ষণীয় (যদিও আমি জানতাম না যে এটি এরকম আচরণ করবে এবং এটি কেন ভাল তা দেখতে ভাল।

সবচেয়ে সহজ সমাধান (যদিও এটি সর্বাধিক অর্থপূর্ণ নয়) কেবলমাত্র শর্তটি $ i! = 'Z' এ পরিবর্তন করা হবে would

<?php
for ($i = 'a'; $i != 'z'; $i++)  
    echo "$i\n";
?>

4
নোট করুন যে এটি আপনাকে z তে নয়, কেবল y তে সরবরাহ করবে
মার্ক বেকার

Doh! হ্যাঁ, ভাল পয়েন্ট। আমি বর্ধন এবং তুলনা উভয়ের পিছনে যুক্তি দেখতে পাচ্ছি, তবে এটি
নিশ্চিতই

0

পিএইচপি 'এএ' 'জেড' এর চেয়ে কম বিবেচনা করে না। এটি করার সর্বোত্তম উপায় হ'ল:

for($i = 'a'; $i != 'aa'; $i++) {
  echo $i;
}

ABCDEFGHIJKLMNOPQRSTUVWXYZ


0

সম্ভবত এই কোডটি কাজ করবে। এটি সহজ এবং বোঝা যায়:

<?php
$ascii_val = ord("a");
for($i=$ascii_val;$i<$ascii_val+26;$i++){
echo chr($i)."\n";
}
?>

যেখানে 26 বর্ণমালার মোট অক্ষরের সংখ্যা।


-3

বাহ আমি সত্যিই এই সম্পর্কে জানতাম না তবে এটি কোনও বড় কোড নয় যা আপনি "z" প্রতিধ্বনিত করতে পারেন লুপের পরে মার্ক অবশ্যই একেবারে ঠিক আছে আমি তার পদ্ধতিটি ব্যবহার করি তবে আপনি যদি বিকল্প চান তবে এটিও আপনি চেষ্টা করতে পারেন

<?php
for ($i = "a"; $i = "y"; $i++) {
    echo "$i\n";
    if ($i == "z") {}
}
echo "z";
?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.