2011-12-02 14 views
8

Hay una cadena que contiene caracteres [a-zA-Z0-9]. Esto debería ser 26 * 2 + 10 = 62 posibilidades en un personaje y 62^2 en dos. ¿Cuál es la forma preferida de incrementar un valor de dicha cadena, de modo que 'aA', se convierte en 'aB', etc.? ¿Hay alguna cosa incorporada en PHP que pueda ayudar?¿Cómo incrementar una cadena alfanumérica en PHP?

Sé que puede incrementar una cadena, pero solo letras minúsculas. Esencialmente, el resultado debería ir de 'a' a 'aa' en 61 incrementos.

+0

+1, interesante acerca de esta cuestión. – Giberno

+2

No sabía que PHP hizo esto, pero ahora sí. http://php.net/manual/en/language.operators.increment.php –

+0

¿Cuál es la progresión deseada? Quiero decir, 'a b c ... x y z A B C ... X Y Z 0 1 2 ... 7 8 9 aa' ¿no es así, obviamente? Entonces, ¿qué personajes varían más rápido y en qué orden? –

Respuesta

2

El @simshaun no trabajan para mí. Reviso la documentación y encontré base_convert que puede funcionar para usted (en la base 35) y un comentario de "francesco [at] paladinux.net" con una función para trabajar en base65.

lo que la solución puede ser:

convertido al B10 -> Valor mínimo de 1 -> Convertir base de 65

EDIT 1

hablando de convertir creo a base 64 de codificación por lo que he escrito estos 2 funcs usan números de codificación/decodificación base64. Desafortunadamente, el juego de caracteres utilizado es un poco más grande: [a-zA-Z0-9/+ =], pero utilizando una función interna más eficiente.

El Cero 0 es "AA =="

function nencode($in){ 
     $res =""; 
     while(1){ 
       $b = $in & 0xff; 
       $res = chr($b) . $res; 

       if($in > 0xff){ 
         $in = $in >> 8; 
       } else { 
         break; 
       } 
     } 
     return base64_encode($res); 
} 

function ndecode($in){ 

     $rv=0; 
     $res =base64_decode($in); 
     for($t = 0 ; $t < strlen($res) ; $t++){ 
       if($t>0){ 
         $rv = $rv << 8; 
       } 
       $c = ord($res{$t}); 
       $rv |= $c; 
     } 
     return $rv; 
} 
+0

No puede 'base_convert' con base> 36 – Fluffy

+0

¿Ha visto la publicación de francesco [at] paladinux.net? –

+0

Lo siento, no sé cómo podría haberme perdido ese – Fluffy

4

Esto funciona para mí:

<?php 
$str = 'a'; 
echo ++$str; // b 

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

$str = 'aA'; 
echo ++$str; // aB 
+0

Esto es lo mismo que letras minúsculas; las mayúsculas se mantendrán en mayúsculas. – Fluffy

+0

¿Está buscando una forma de pasar de 'zz' a' aA'? Creo que estoy malinterpretando la pregunta. – simshaun

+1

Bueno, si hablamos de cadena de 1 carácter, '$ a = 'a'' debería convertirse en' aa' en 61 incrementos. Su solución lo hace en 25. – Fluffy

2

Pruebe esta función:

<?php 
function increment(&$string){ 
    $last_char=substr($string,-1); 
    $rest=substr($string, 0, -1); 
    switch ($last_char) { 
    case '': 
     $next= 'a'; 
     break; 
    case 'z': 
     $next= 'A'; 
     break; 
    case 'Z': 
     $next= '0'; 
     break; 
    case '9': 
     increment($rest); 
     $next= 'a'; 
     break; 
    default: 
     $next= ++$last_char; 
    } 
    $string=$rest.$next; 
} 

    //sample 
    $string='a'; 
    for($i=1;$i<=128;$i++){ 
     echo $string."<br>"; 
     increment($string); 
    } 
    ?> 
+0

Después de 'a9' va a' aaa' en vez de 'ba'. –

+0

tiene razón, corrigió – phobia82

+0

ahora está funcionando bien – phobia82

1

creo que esto hace fundamentalmente lo que está buscando.

<?php 

$chars = array('', 
    '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', 
    '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', 
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'); 

$increment1 = 0; 
$increment2 = 0; 

for ($i = 0; $i <= 200; $i++) { 
    if ($increment2 === 62) { 
     $increment1++; 
     $increment2 = 1; 
    } else { 
     $increment2++; 
    } 
    echo "{$chars[$increment1]}{$chars[$increment2]} "; 
} 

/* 
Output: 
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 
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 
0 1 2 3 4 5 6 7 8 9 aa ab ac ad ae af ag ah ai aj ak al 
am an ao ap aq ar as at au av aw ax ay az aA aB aC aD aE 
aF aG aH aI aJ aK aL aM aN aO aP aQ aR aS aT aU aV aW aX 
aY aZ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 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 
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 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ca cb 
cc cd ce cf cg ch ci cj ck cl cm cn co 
*/ 
2

Me gusta este. Cómo usar: ClassX :: increment ('p04E7K', 6); ClassX :: decrement ('p04E7K', 6);

Código:

class ClassX { 
    public static $baseCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

    public static function increment($x, $digits) 
    { 
     $charList = static::$baseCharacters; 

     // completa cadeia de caracteres com o numero de digitos parametrizados 
     $x = trim($x); 
     if(strlen($x) < $digits) { 
      $x = str_pad($x, $digits, substr($charList, 0, 1), STR_PAD_LEFT); 
     } 

     $result = preg_split("//", $x, -1, PREG_SPLIT_NO_EMPTY); 
     // percorre a cadeia de caracteres de tras pra frente e incrementa o primeiro caractere possivel 
     for ($i = $digits - 1; $i >= 0; --$i) 
     { 
      $char = $result[$i]; 
      $currentChar = strpos($charList, $char); 
      $nextCharPosition = $currentChar+1; 

      if($nextCharPosition < strlen($charList)) { 
       $nextChar = substr($charList, $nextCharPosition, 1); 

       $result[$i] = $nextChar; 
       break; 
      } 
     } 

     return implode('', $result); 
    } 

    public static function decrement($x, $digits) 
    { 
     $charList = static::$baseCharacters; 

     // completa cadeia de caracteres com o numero de digitos parametrizados 
     if(strlen($x) < $digits) { 
      $x = str_pad($x, $digits, substr($charList, 0, 1), STR_PAD_LEFT); 
     } 

     $result = preg_split("//", $x, -1, PREG_SPLIT_NO_EMPTY); 
     // percorre a cadeia de caracteres de tras pra frente e decrementa o primeiro caractere possivel 
     for ($i = $digits - 1; $i >= 0; --$i) 
     { 
      $char = $result[$i]; 
      $currentChar = strpos($charList, $char); 
      $previousCharPosition = $currentChar-1; 

      if($previousCharPosition > -1) { 
       $previousChar = substr($charList, $previousCharPosition, 1); 

       $result[$i] = $previousChar; 

       // define os caracteres apos o decrementado para o ultimo caractere. ex: 3[00] > 2[99] 
       for ($j = $i + 1; $j < $digits && $i < $digits - 1; ++$j) 
        $result[$j] = substr($charList, strlen($charList)-1, 1); 
       break; 
      } 
     } 

     return implode('', $result); 
    } 
} 
0

que llegó a esta pregunta ya que estaba buscando también para una manera de generar auto incrementar identificador único alfanumérico muy similar a lo que tenemos en el dinero móvil (M-PESA) en Kenia. Para referencia, aquí es una captura de pantalla que muestra las transacciones Screenshot showing sample MPESA transactions que me gustaría dejarlo aquí si alguien está buscando también para propiedades similares: es decir - Autoincrement alfanumérica - Todos los caracteres en mayúscula - aumento automático de la longitud de la cadena una vez agotado . - el incremento es de 0 a 9 y luego la A a la Z antes de incrementar el carácter adyacente del número y es una modificación del @ de phobia82 respuesta

function increment($string){ 
    $last_char=substr($string,-1); 
    $rest=substr($string, 0, -1); 
    switch ($last_char) { 
     case '': 
      $next= 'A'; 
      break; 
     case 'Z': 
      $next = '0'; 
      $unique = increment($rest); 
      $rest = $unique; 
      break; 
     case '9': 
      $next= 'A'; 
      break; 
     default: 
      $next = ++$last_char; 
      break; 
    } 
    $string=$rest.$next; 
    return $string; 
} 
Cuestiones relacionadas