utilidad texto salto mostrar mensaje linea insertar imprimir etiquetas combinar codigo php

php - texto - ¿Por qué este código simplemente no imprime las letras A a Z?



texto en php (13)

¿Por qué no usar simplemente el range(''a'',''z'') ?

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

Este fragmento da el siguiente resultado (las nuevas líneas se reemplazan por espacios):

abcdefghijklmnopqrstu vwxyz aa ab ac ad ae af ag ah ai aj ak al am un AP aq ao ar como en au av aw ax ay az ba bb bd bc sea bf bg bh bi bj bk bl bm bn bo pb bq br s ancho bt bu bv bw bx por bz ca cb cc cd cc cc ch ci cj cc cl cc co cp c c c c cc cc c c c c c c d d d d d d d d d d d d d d d d d d d d du dv dw dx dy dz ea eb ec ed ee e eg eh ei ej ek el em en eo ep eq er e er e eu ev ew ex ... on to yz


De la docs :

PHP sigue la convención de Perl cuando se trata de operaciones aritméticas en variables de caracteres y no en C''s.

Por ejemplo, en Perl ''Z''+1 convierte en ''AA'' , mientras que en C ''Z''+1 convierte en ''['' ( ord(''Z'') == 90 , ord(''['') == 91 ) .

Tenga en cuenta que las variables de caracteres pueden incrementarse pero no disminuirse, y aún así solo se admiten caracteres ASCII simples (az y AZ).

De los comentarios: -
También se debe tener en cuenta que <= es una comparación lexicográfica, por lo que ''z''+1 ≤ ''z'' . (Dado que ''z''+1 = ''aa'' ≤ ''z'' . Pero ''za'' ≤ ''z'' es la primera vez que la comparación es falsa.) Romper cuando $i == ''z'' funcionaría, por ejemplo.

Ejemplo aquí .


Debido a que una vez que se alcanza ''z'' (y este es un resultado válido dentro de su rango, $ i ++ lo incrementa al siguiente valor en secuencia), el siguiente valor será ''aa''; y alfabéticamente, ''aa'' es <''z'', por lo que la comparación nunca se cumple

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


El PHP no considera a ''AA'' menos que ''Z''. La mejor manera de hacer esto es:

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

ABCDEFGHIJKLMNOPQRSTU VWXYZ


Otras respuestas explican el comportamiento observado del código publicado. Esta es una forma de hacer lo que quiere (y es un código más limpio, IMO):

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

En respuesta al comentario / pregunta de ShreevatsaR sobre la función de range : Sí, produce el "punto final correcto", es decir, los valores pasados ​​a la función están en el rango. Para ilustrar, la salida del código anterior fue:

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


Otros ya dijeron por qué PHP no muestra lo que esperas. Así es como obtienes el resultado que deseas:

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


PHP tiene la función de letras en bucle y puede exceder más allá de los caracteres individuales; el resto se hará de esta manera: aa ab ac ... zz, y así sucesivamente.

Prueba esto:

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


Prueba este código. Creo que este código te será útil.

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

Muestra 26 letras en secuencia.


Quizás este código funcione. Es fácil y se puede entender:

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

donde 26 es el número total de letras en el alfabeto.


Si bien las respuestas anteriores son reveladoras de lo que está sucediendo, y son bastante interesantes (no sabía que se comportaría así, y es bueno ver por qué).

La solución más fácil (aunque quizás no la más significativa) sería simplemente cambiar la condición a $ i! = ''Z''

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


También esto puede ser usado:

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


Wow, realmente no sabía esto, pero no es un gran código. Puedes probar "z" después del bucle. Mark tiene toda la razón. Utilizo su método, pero si quieres una alternativa, también puedes intentarlo.

<?php for ($i = "a"; $i = "y"; $i++) { echo "$i/n"; if ($i == "z") {} } echo "z"; ?>


<?php $i = ''a''; do { echo ($j=$i++),"/r/n"; } while (ord($j) < ord($i)); ?>