2011-12-02 13 views
8

Istnieje ciąg znaków zawierający znaki [a-zA-Z0-9]. Powinno to wynosić 26 * 2 + 10 = 62 możliwości w jednym znaku i 62^2 w dwóch. Jaki jest preferowany sposób zwiększania wartości takiego łańcucha, aby "aA" stało się "aB" itp.? Czy jest jakiś wbudowany w PHP, który może pomóc?Jak zwiększyć ciąg alfanumeryczny w PHP?

Wiem, że można zwiększyć ciąg znaków, ale to tylko małe litery. Zasadniczo wynik powinien wynosić od "a" do "aa" w 61 krokach.

+0

+1 interesujące w tej kwestii. – Giberno

+2

Nie wiedziałem, że PHP to zrobił, ale robię to teraz. http://php.net/manual/en/language.operators.increment.php –

+0

Jaki jest pożądany postęp? Mam na myśli, że "a c ... x y z A B C ... X Y Z 0 1 2 ... 7 8 9 aa' nie jest to oczywiście. Które postacie zmieniają się najszybciej i w jakiej kolejności? –

Odpowiedz

2

@simshaun nie działa dla mnie. Sprawdzam dokumentację i znalazłem base_convert, który może pracować dla ciebie (na podstawie 35) i komentarz "francesco [at] paladinux.net" z funkcją do pracy na base65.

więc rozwiązanie może być:

przeliczyć B10 -> przyrost +1 -> konwersji podstawa 65

EDIT 1

mówisz nawróconego myślę base64 kodowania więc napisałem to 2 funkcje używające numerów kodowania/dekodowania base64. Niestety, używany zestaw znaków jest nieco większy: [a-zA-Z0-9/+ =], ale użycie funkcji wewnętrznej jest bardziej wydajne.

Zero 0 jest "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

Nie można "base_convert" z bazą> 36 – Fluffy

+0

Czy widzisz post francesco [at] paladinux.net? –

+0

Przepraszam, nie wiem, jak mogłem tęsknić za tym – Fluffy

4

Działa to dla mnie:

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

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

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

Jest to to samo, co małe litery - wielkie litery pozostaną wielkimi literami. – Fluffy

+0

Szukasz sposobu na przejście z 'zz' na' aA'? Pomyśl, że nie rozumiem tego pytania. – simshaun

+1

Cóż, jeśli mówimy o łańcuchu 1-znakowym, '$ a = 'a'' powinno stać się' aa' w 61 krokach. Twoje rozwiązanie robi to w 25. – Fluffy

2

Spróbuj funkcję:

<?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

Po 'a9' idzie do' aaa' zamiast 'ba'. –

+0

masz rację, naprawiono – phobia82

+0

teraz działa dobrze – phobia82

1

myślę, że to zasadniczo robi to, co jesteś po.

<?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

Podoba mi się ten. Sposób użycia: ClassX :: increment ('p04E7K', 6); ClassX :: dekrement ('p04E7K', 6);

Kod:

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

przyszedłem na to pytanie jak szukałem również sposobu generowania auto zwiększający alfanumeryczny unikatowy identyfikator bardzo podobny do tego, co mamy w telefonie pieniędzy (M-PESA) w Kenii. Dla porównania, tutaj znajduje się zrzut ekranu pokazujący transakcje Screenshot showing sample MPESA transactions Chciałbym zostawić tutaj, jeśli ktoś szuka też podobnych właściwościach: tj - autoIncrement alfanumeryczny - Wszystkie znaki wielkimi literami - automatyczne zwiększenie długości łańcucha raz wyczerpany . - przyrost wynosi od 0 do 9, a następnie A do Z przed zwiększając przylegającą postać numeru i modyfikacja użytkownika @ phobia82 odpowiedzi

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; 
} 
Powiązane problemy