이 코드는 왜 문자 A에서 Z까지 인쇄하지 않습니까?


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

이 스 니펫은 다음 출력을 제공합니다 (줄 바꾸기는 공백으로 바 space).

abcdefghijklmnopqrstu vwxyz aa ab ac ad ae a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn dn do dp dq dr ds dt 뒤 dv dw dx dy dz ea eb ec ed ee ef 예


31
구문이 반대를 확신 시키려고해도 PHP는 C가 아닙니다.
joni

3
이것은 매우 작은 변화로 저에게 효과적입니다. for ($ i = 'a'; $ i! = 'aa'; $ i ++) {echo "$ i \ n"; }
초현실적 인 꿈

2
PHP가 C가 아니라는 의견은 가장 예민한 예입니다. php와 동일하지 않습니다 : $c = 'a';, 요점은 C에는 char (문자 1 기호) 유형이 있지만 PHP에서는 그렇지 않습니다 $c = 'a';. 그렇기 때문에 PHP에서 U가 28자를 적절하게 반복 할 수 없습니다. 모든 프로그래머가 수학 실습을 잊지 않고 저수준의 언어와 강력한 타이핑을 배우기를 바랍니다.
Arthur Kushman

와우 정말 멋지지만 왜 "z"에서 멈추지
않았을까

평등 ( ==또는 !=) 을 사용하여 예상 종점을 얻는 방법은 관련 질문에 대한이 답변을 확인하십시오 .
IMSoP

답변:


342

로부터 문서 :

PHP는 C가 아닌 문자 변수에 대한 산술 연산을 처리 할 때 Perl의 규칙을 따릅니다.

예를 들어 Perl에서는 'Z'+1으로 'AA', C 에서는 ( , ) 'Z'+1로 바뀝니다 .'['ord('Z') == 90ord('[') == 91

문자 변수는 증가 할 수 있지만 감소 할 수 없으며 일반 ASCII 문자 (az 및 AZ) 만 지원됩니다.

주석에서 :-
또한<=사전 사전 비교라는점에 유의해야합니다'z'+1 ≤ 'z'. (이후'z'+1 = 'aa' ≤ 'z'그러나이.'za' ≤ 'z'처음 인 비교는 false입니다.) 속보 때$i == 'z'예를 들어, 작동합니다.

여기에 예가 있습니다 .


으악 .. 미쳤다! 나는 항상 사용 ord()했으므로 나는 이것을 눈치 채지 못했습니다.
mpen

68
완벽을 기하기 위해 "<="는 사전 식 비교이므로 'z'+ 1 ≤ 'z'도 추가해야합니다. ( 'z'+ 1 = 'aa'≤'z'이후. 'zz'≤'z'는 처음으로 비교가 거짓입니다.) 예를 들어 $ i == 'z'가 작동하면 중단됩니다.
ShreevatsaR

6
ShreevatsaR 말대로, 그것은 ++ 연산자에 초점을하지 않는 비교가 아닌 문제의 산술입니다
SLF

10
@ShreevatsaR : 실제로, 'yz'+ 1 = 'za'. 실패한 첫 번째 비교는 'za'<= 'z'입니다.
Milan Babuškov

2
댓글들 주셔서 감사합니다! 핵심 'aa'렉시 그래픽으로 보다 작다는 것 'z'입니다. 이것이 루프가 계속되는 이유입니다. 그리고 그것은에 정지 'yz'하기 때문에 'za'보다 크다 z. 이 예를 확인하십시오 .
CMS

123

일단 'z'에 도달하면 (그리고 이것이 범위 내에서 유효한 결과이고, $ i ++는 순서대로 다음 값으로 증가시킵니다), 다음 값은 'aa'입니다. 알파벳순으로 'aa'는 < 'z'이므로 비교는 절대 이루어지지 않습니다.

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

55
'z'++ = 'aa'이지만 'aa'< 'z'는 이상합니다. 그 논리는 잘 흐르지 않습니다.
Matthew Vines

19
@ 매튜 : 알파벳순으로 정렬하십시오. 'aa'가 먼저 올 것이므로 문자열 'z'보다 "보다 작습니다". 루프는 알파벳순으로 "보다 큼"(이후에 나오는) 'z'이기 때문에 'zz'에서 종료됩니다. 무언가를 "증가"하고 더 적은 가치를 얻을 수 있다는 의미에서 비논리적이지만 알파벳순으로 논리적입니다.
eldarerathis

2
문자 증분은 Perl 논리입니다 (문서의 CMS 인용문 참조). 'aa'< 'z'비교는 표준 문자열 비교 논리입니다. 이상하지 않습니다. 일단 사용법을 이해하면 ... 여기의 답변에서 많은 사람들이하지 않습니다.
Mark Baker

5
@ eldarerathis 오, 나는 그것이 어떻게 작동하는지 확실히 이해합니다. 나는 단지 그것이 동시에 이상하다는 것을 안다.
Matthew Vines

2
그것은 같은 논리 시리즈를 따르는 Excel 칼럼을 가지고 놀면서 엄청나게 유용합니다
Mark Baker

97

다른 답변은 게시 된 코드의 관찰 된 동작을 설명합니다. 원하는 것을 수행하는 한 가지 방법이 있습니다 (그리고 더 깨끗한 코드, IMO).

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

범위 함수 에 대한 ShreevatsaR의 의견 / 질문에 대한 응답으로 : "올바른 종점"을 생성합니다. 즉 함수에 전달 된 값이 범위에 있습니다. 위 코드의 결과는 다음과 같습니다.

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
range ()에 올바른 끝 점이 포함됩니까? 다른 언어를 사용한 경험에서도 예상치 못한 결과가 발생했습니다!
ShreevatsaR

1
@ShreevatsaR : 예, range ()는 "올바른"엔드 포인트를 제공합니다. 자세한 내용은 편집 한 답변을 참조하십시오 (그리고 함수 링크 참조).
GreenMatt

1
내가 말할 수있는 것은… 더 많은 PHP 광기. :-) range ()가 이런 식으로 작동하는 다른 언어는 없습니다. (확실히, Haskell 또는 Python은 아닙니다.) Dijkstra가 이것에 대해 뭔가 쓰지 않았습니까?
ShreevatsaR

10
광기는 PHP와 일치하지 않습니다. range ( 'A', 'CZ')는 ++ 증분 기와 완전히 다르게 작동하며 결과 배열에는 A, B 및 C의 세 가지 값만 포함됩니다.
Mark Baker

35

다른 사람들은 PHP가 왜 당신이 기대하는 것을 보여주지 않는지 이미 말했습니다. 원하는 결과를 얻는 방법은 다음과 같습니다.

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

2
불필요한. 루프를 종료하기 위해 ord ()를 전혀 수행 할 필요가 없습니다.
Mark Baker

2
+1 PHP의 편심 기능 중 하나에 익숙하지 않은 경우 훨씬 이해하기 쉽습니다.
lonesomeday

1
이것은 자체 문서화 코드의 훌륭한 예입니다. 서수 값을 사용하여 변수를 문자로 표시하는 정확한 b / c를 쉽게 이해할 수 있습니다. 최대 값에 대한 테스트가 다음과 같이 한 번만 결정되면 for-loop가 더 효율적입니다. "for ($ i = ord ( 'a'), $ max = ord ( 'z'); $ i <= $ max; $ i ++) { "
slevy1


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는 문자를 반복하는 기능이 있으며 단일 문자를 초과 할 수 있습니다. 나머지는 이런 식으로 수행 될 것입니다 : aa ab ac ... 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
이것은 단지 당신에게 a가 아니라 y를 줄 것입니다
Mark Baker

도! 네, 좋은 지적입니다. 나는 증가와 비교의 논리를 볼 수 있지만 때때로 $ a ++ <$ a
jon_darkstar

0

PHP는 'AA'를 '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";
?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.