2011-12-02 54 views
8

Có một chuỗi, chứa các ký tự [a-zA-Z0-9]. Điều này sẽ là 26 * 2 + 10 = 62 khả năng trong một ký tự và 62^2 trong hai. Cách ưu tiên để tăng giá trị của một chuỗi như vậy, sao cho 'aA', trở thành 'aB', v.v ...? Có bất kỳ công cụ tích hợp nào trong PHP, có thể giúp ích không?Làm thế nào để tăng một chuỗi chữ số trong PHP?

Tôi biết bạn có thể tăng chuỗi, nhưng đó chỉ là chữ thường. Về cơ bản, kết quả sẽ chuyển từ 'a' sang 'aa' với 61 gia số.

+0

+1, thú vị về câu hỏi này. – Giberno

+2

Tôi không biết PHP đã làm điều này, nhưng tôi làm bây giờ. http://php.net/manual/en/language.operators.increment.php –

+0

Tiến trình mong muốn là gì? Ý tôi là, một b ... x Y Z 0 1 2 ... 7 8 9 aa' đúng không, rõ ràng là vậy. Vậy nhân vật nào thay đổi nhanh nhất và theo thứ tự nào? –

Trả lời

2

Các @simshaun không làm việc cho tôi. Tôi kiểm tra các tài liệu và tôi tìm thấy base_convert có thể làm việc cho bạn (trên cơ sở 35) và một bình luận của "francesco [at] paladinux.net" với một chức năng để làm việc trên base65.

vì vậy giải pháp có thể là:

chuyển đổi sang B10 -> tăng 1 -> chuyển đổi cơ sở 65

EDIT 1

nói về chuyển đổi tôi nghĩ đến base64 mã hóa vì vậy tôi đã viết 2 funcs này sử dụng số mã hóa/giải mã base64. Thật không may bộ ký tự được sử dụng lớn hơn một chút: [a-zA-Z0-9/+ =], nhưng sử dụng hàm bên trong hiệu quả hơn.

Zero 0 là "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

Bạn không thể 'base_convert' với cơ số> 36 – Fluffy

+0

Bạn có thấy bài viết francesco [at] paladinux.net không? –

+0

Xin lỗi, tôi không biết làm thế nào tôi có thể đã bỏ lỡ rằng – Fluffy

4

này làm việc cho tôi:

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

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

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

Điều này giống với chữ cái thường - chữ hoa sẽ viết hoa. – Fluffy

+0

Vì vậy, bạn đang tìm kiếm một cách để đi từ 'zz' đến' aA'? Nghĩ rằng tôi hiểu nhầm câu hỏi. – simshaun

+1

Vâng, nếu chúng ta nói về 1 chuỗi ký tự, '$ a = 'a'' sẽ trở thành' aa' với số gia là 61. Giải pháp của bạn làm như vậy trong 25. – Fluffy

2

Hãy thử chức năng này:

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

Sau 'a9' nó đi đến' aaa' thay vì 'ba'. –

+0

bạn đã đúng, đã sửa – phobia82

+0

bây giờ nó hoạt động tốt – phobia82

1

Tôi nghĩ rằng điều này về cơ bản là những gì bạn đang sau.

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

Tôi thích trang này. Cách sử dụng: ClassX :: increment ('p04E7K', 6); ClassX :: decrement ('p04E7K', 6);

Code:

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

tôi đến câu hỏi này như tôi đang tìm kiếm cũng kiếm một cách để tạo ra tự động incrementing chữ và số ID duy nhất rất giống với những gì chúng tôi có trong tiền điện thoại di động (M-PESA) ở Kenya. Để tham khảo, đây là một bức ảnh chụp các giao dịch Screenshot showing sample MPESA transactions Tôi muốn để lại nó ở đây nếu có ai đang tìm kiếm còn bởi giá trị tương tự: ví dụ: - autoincrement chữ - Tất cả các nhân vật trong hoa - tăng tự động có độ dài chuỗi khi kiệt sức . - thặng dư là 0-9 sau đó A đến Z trước incrementing nhân vật liền kề số và là một sửa đổi của @ phobia82 của câu trả lời

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; 
} 
Các vấn đề liên quan