2010-04-20 11 views

Respuesta

101

La forma más eficiente de hacer esto en mi opinión es simplemente incrementar la variable de cadena.

$str = 'a'; 
echo ++$str; // prints 'b' 

$str = 'z'; 
echo ++$str; // prints 'aa' 

Como se ve incrementando 'z' dar 'aa' si usted no quiere esto, pero en vez desee restablecer para obtener una 'a' simplemente puede comprobar la longitud de la cadena resultante y si su >1 restablecerla.

$ch = 'a'; 
$next_ch = ++$ch; 
if (strlen($next_ch) > 1) { // if you go beyond z or Z reset to a or A 
$next_ch = $next_ch[0]; 
} 
+0

@Mathias hubo un pequeño error al mezclar el aumento previo y posterior. Cámbielo a '$ b = ++ $ a;' – nickf

+0

@Mathias: Mi mal ... debe usar el preincremento como: '$ b = ++ $ a;' @nickf: Gracias :) – codaddict

+0

Su el código de muestra es incorrecto '$ next_ch = $ ch ++;' no almacenará el valor incrementado en '$ next_ch', pero * will * de hecho incrementará' $ ch'. Me confundió allí por un segundo :) Un gran consejo, no sabía que esto fuera posible. ¡Definitivamente la forma más eficiente de hacerlo! –

8

Bueno, depende qué es exactamente lo que quiere hacer con las "cajas de borde". ¿Qué resultado espera cuando el personaje es z o Z? ¿Desea la próxima letra del mismo caso, o solo la próxima letra, punto?

Sin saber la respuesta a eso, para el caso muy básico, sólo puede hacer esto:

$next_character = chr(ord($current_character) + 1); 

Pero cuando estás en Z esto le dará [, y z le dará {, de acuerdo con los valores ASCII.


Editado según comentario:

Si necesita el siguiente carácter del mismo caso, es probable que pueda simplemente añadir controles simples después de la línea anterior:

if ($next_character == '[') 
    $next_character = 'A'; 
else if ($next_character == '{') 
    $next_character = 'a'; 

Son operaciones muy simples, realmente no me preocuparía la eficiencia en un caso como este.

+0

Quiero la siguiente letra con la misma caja. Si el personaje es 'z', espero' a'. –

+0

¿No sería más rápido simplemente devolver 'A' o' a' inmediatamente cuando el caracter es 'Z' o' z'? –

14

depende de lo que quiere hacer cuando se pulse Z, pero hay algunas opciones:

$nextChar = chr(ord($currChar) + 1); // "a" -> "b", "z" -> "{" 

También se puede hacer uso de la función de PHP range():

$chars = range('a', 'z'); // ['a', 'b', 'c', 'd', ...] 
5

¿Qué tal utilizando ord() and chr()?

<?php 
    $next = chr(ord($prev)+1); 
?> 
+0

¡Corto y dulce! Pero ¿qué pasa con los casos extremos ('z' debería devolver' a')? ¿Hay una mejor manera de verificar esto que no sea una declaración 'if()'? –

+1

$ siguiente = ($ prev == 'z')? 'a': chr (ord ($ prev) +1); – Anax

+0

Gracias por esto también @Anax – Jamus

3

Puesto que sólo se preocupan por los caracteres en minúsculas en este caso, voy a utilizar el siguiente código, basado en las respuestas publicadas aquí:

function nextLetter(&$str) { 
$str = ('z' === $str ? 'a' : ++$str); 
} 

Gracias por la ayuda, chicos!

3
$val = 'z'; 
echo chr((((ord($val) - 97) + 1) % 26) + 97); 

agradable y fácil :-)

+0

y para 'Z' es '$ next = chr ((((ord ($ c) - 65) + 1)% 26) + 65); 'ie ord ('A') – loretoparisi

0

crear una matriz de todas las letras, de la búsqueda de la carta existente y volver a su letra siguiente. Si llega a la última letra, devuelva la primera letra.

Cuestiones relacionadas