यह कोड केवल A से Z तक अक्षरों को क्यों नहीं प्रिंट करता है?


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

यह स्निपेट निम्न आउटपुट देता है (नए स्थान रिक्त स्थान द्वारा प्रतिस्थापित किए जाते हैं):

abcdefghijklmnopqrstu vwxyz aa ab ac ae af ag ai aj aj al ak al a aur ap aq as au av aw ax az ba az b bb bd bd be bg bh b bj bk bm bm bm bn bp bq brs bs bw bx द्वारा bz ca cc cc cd cf cg c ci c c c c c c c c c c c c c c c c c cr cr cs cv cv cw cw cx cy cz da dc dc de dg dh di dj dl dl dm dn do dp dr ds डॉ। डु डीवी डीडब्ल्यू डीएक्स डाई डीजी ईई ईबी ईके ईडी ईई एफई जैसे ईएच ईई ईजे ईके ईएल ईएम ईओ एप ईक एर एट एट ईआर ईवे ईव पूर्व ... यज़ पर


31
PHP सी नहीं है, भले ही सिंटैक्स आपको इसके विपरीत समझाने की कोशिश करता है।
जोनी

3
यह मेरे लिए एक बहुत छोटे परिवर्तन के साथ काम करता है: ($ i = 'a'; $ i! = 'Aa'; $ i ++) {echo "$ i \ n"; }
असली सपने

2
उस PHP के बारे में टिप्पणी सी नहीं है - सबसे उत्सुक था, उदाहरण: c: char c = 'a' में; php के समान नहीं है: $c = 'a';बिंदु यह है कि C में चार का प्रकार है (वर्ण 1 प्रतीक), लेकिन PHP में नहीं, यदि U PHP को बताता है $c = 'a';- इसका मतलब है कि यह केवल 1 वर्ण के साथ एक स्ट्रिंग है। यही कारण है कि U PHP में पर्याप्त रूप से 28 वर्णों के माध्यम से लूप नहीं कर सकता है। मुझे उम्मीद है कि प्रत्येक प्रोग्रामर मैथ प्रथाओं के बारे में भूलने के बिना, निम्न-स्तरीय भाषाओं और इसके साथ-साथ मजबूत-टाइपिंग सीखेंगे, जिससे उन्हें मजबूत होने में मदद मिलेगी।
आर्थर कुशमैन

वाह जो वास्तव में अच्छा है, लेकिन यह "z" पर क्यों नहीं रुका
प्रशांत बिंद

समानता का उपयोग करके अपेक्षित अंत-बिंदु प्राप्त करने के तरीके के लिए ( ==या !=) संबंधित प्रश्न के इस उत्तर को देखें
IMSoP

जवाबों:


342

से डॉक्स :

PHP वर्णों पर अंकगणितीय संक्रियाओं से निपटने के दौरान पर्ल के सम्मेलन का अनुसरण करती है और सी की नहीं।

उदाहरण के लिए, पर्ल में 'Z'+1बदल जाता है 'AA', जबकि सी में 'Z'+1बदल जाता है '['( ord('Z') == 90,ord('[') == 91 )।

ध्यान दें कि वर्ण चर को बढ़ाया जा सकता है, लेकिन घटाया नहीं जाता है और यहां तक ​​कि केवल सादे ASCII वर्ण (az और AZ) समर्थित हैं।

टिप्पणियों से: -
यह भी ध्यान दिया जाना चाहिए कि<=एक शाब्दिक तुलना है'z'+1 ≤ 'z'। (चूंकि'z'+1 = 'aa' ≤ 'z'। लेकिन'za' ≤ 'z'पहली बार तुलना झूठी है।)$i == 'z'उदाहरण के लिए, काम करतेसमय ब्रेकिंग।

यहाँ उदाहरण है


हाहा..तो क्या पागल है! मैंने हमेशा उपयोग किया है ord()इसलिए मैंने कभी इस पर ध्यान नहीं दिया।
एमपीएन

68
पूर्णता के लिए, आपको यह भी जोड़ना चाहिए कि "<=" लेक्सोग्राफिक तुलना है, इसलिए 'z' + 1 ≤ 'z'। (चूँकि 'z' + 1 = 'aa'''z'। लेकिन 'zz'z'z' पहली बार है जब तुलना झूठी है।) $ i == 'z' को तोड़ना उदाहरण के लिए काम करेगा।
श्रीवत्सआर

6
के रूप में ShreevatsaR कह रहा है, यह तुलनित्र, नहीं अंकगणित परेशानी है कि है, ++ ऑपरेटर पर ध्यान केंद्रित नहीं है
SLF

10
@ श्रीवत्सआर: वास्तव में, 'yz' + 1 = 'za'। पहली तुलना जो विफल होती है, वह है 'ज़ा' <= 'ज़'
मिलन बाबूकोव

2
टिप्पणियों के धन्यवाद मित्रों! हाँ, प्रमुख मुद्दा यह है कि 'aa'है कोषगत की तुलना में छोटे 'z', तो इस कारण पाश जारी है। और उस पर बंद हो जाता है 'yz', क्योंकि 'za'तुलना में अधिक है zइस उदाहरण की जाँच करें
CMS

123

क्योंकि एक बार 'z' पहुंच जाता है (और यह आपकी सीमा के भीतर एक वैध परिणाम है, $ i ++ इसे अनुक्रम में अगले मूल्य में बढ़ाता है), अगला मूल्य 'आ' होगा; और वर्णानुक्रम में, 'आ' <'z' है, इसलिए तुलना कभी पूरी नहीं होती

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

55
यह अजीब है कि 'z' ++ = 'aa', लेकिन 'aa' <'z'। वह तर्क बहुत अच्छी तरह से प्रवाहित नहीं होता है।
मैथ्यू वाइन

19
@ मैथ्यू: उन्हें वर्णमाला दें। 'आ' पहले आएगा, इस प्रकार यह "स्ट्रिंग" जेड से कम है। लूप 'zz' पर समाप्त होता है क्योंकि यह वर्णानुक्रम में "अधिक से अधिक" (बाद आता है) 'z' है। यह इस अर्थ में अतार्किक है कि आप किसी चीज़ को "बढ़ा सकते हैं" और कम मूल्य पा सकते हैं, लेकिन यह एक वर्णनात्मक अर्थ में तार्किक है।
एल्डेरैथिस

2
कैरेक्टर इंक्रीमेंट करने वाला पर्ल लॉजिक है (डॉक्स से सीएमएस का उद्धरण देखें)। तुलना 'आ' <'z' मानक स्ट्रिंग तुलना तर्क है। अजीब नहीं है, एक बार जब आप समझ जाते हैं कि इसका उपयोग कैसे करना है ... यहाँ के जवाबों से, बहुत सारे लोग नहीं करते हैं।
मार्क बेकर

5
@eldarerathis ओह मैं निश्चित रूप से समझता हूं कि यह कैसे काम कर रहा है। मुझे बस एक ही समय में यह अजीब लगता है।
मैथ्यू वाइन

2
यह मेरे लिए अविश्वसनीय रूप से उपयोगी है, एक ही तार्किक श्रृंखला का पालन करने वाले एक्सेल कॉलम के साथ खेलना
मार्क बेकर

97

अन्य उत्तर पोस्ट किए गए कोड के देखे गए व्यवहार की व्याख्या करते हैं। यहाँ एक तरीका है जो आप करना चाहते हैं (और यह क्लीनर कोड, IMO है):

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
मैं क्या कह सकता हूं ... अधिक PHP पागलपन। :-) कोई अन्य भाषा नहीं है, जो मुझे पता है कि किस रेंज () में इस तरह से काम होता है। (निश्चित रूप से नहीं, कहते हैं, हास्केल या पायथन।) क्या दिज्क्स्त्र ने इस बारे में कुछ नहीं लिखा?
श्रीवत्सआर

10
पागलपन PHP की असंगति में है। श्रेणी ('ए', 'सीजेड') ++ इंक्रीमेंट करने वाले के लिए पूरी तरह से अलग तरह से काम करती है, और परिणामी सरणी में केवल तीन मान होंगे: A, B और C.
मार्क बेकर

35

दूसरों ने पहले ही कहा कि PHP वह क्यों नहीं दिखाती है जो आप उम्मीद करते हैं। यहां बताया गया है कि आपको वह परिणाम मिल सकता है जो आप चाहते हैं:

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

2
अनावश्यक। आपको ऑर्ड () को बिल्कुल भी करने की आवश्यकता नहीं है, लूप को समाप्त करने के लिए सिर्फ सही तुलना
मार्क बेकर

2
PHP के अधिक विलक्षण विशेषताओं में से एक से परिचित नहीं होने पर +1 बहुत अधिक समझ में आता है।
lonesomeday

1
यह स्व-दस्तावेजीकरण कोड का एक उत्कृष्ट उदाहरण है। यह आसानी से समझ में आता है ठीक है b / c यह क्रमिक मूल्यों का उपयोग करता है और फिर एक चरित्र के रूप में चर को प्रदर्शित करता है। फॉर-लूप अधिक कुशल होगा यदि अधिकतम मूल्य के लिए परीक्षण केवल एक बार निम्नानुसार निर्धारित किया जाता है: "के लिए ($ i = ord ('a'), $ max = ord ('z'); $ i <= $ अधिकतम; $ i ++) {"
slevy1


4

इस कोड को आज़माएं। मुझे लगता है कि यह कोड आपके लिए मददगार होगा।

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

२६ अक्षरों को क्रम से प्रदर्शित करें।



2

यह भी इस्तेमाल किया जा सकता है:

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

2

PHP में लूपिंग अक्षरों का कार्य है और एकल वर्णों से परे हो सकता है; बाकी इस तरह से किया जाएगा: आ अब एसी ... zz, और इसी तरह।

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

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

0

हालांकि उपरोक्त उत्तर क्या चल रहा है, और बहुत ही दिलचस्प है (मुझे नहीं पता था कि यह इस तरह का व्यवहार करेगा, और यह देखने के लिए अच्छा है।

सबसे आसान तय (हालांकि शायद सबसे सार्थक नहीं) बस शर्त को $ i में बदलना होगा! = 'Z'!

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

4
ध्यान दें कि यह केवल आपको y, z नहीं
मार्क बेकर

doh! हाँ, अच्छी बात है। मैं वेतन वृद्धि और तुलना दोनों के पीछे के तर्क को देख सकता हूं, लेकिन यह निश्चित है कि कभी-कभी $ ++ एक $ <a
jon_darkstar

0

PHP does AA ’को does Z’ से कम नहीं मानती है। इसे बनाने का सबसे अच्छा तरीका है:

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";
?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.