PHP:字符串增量器

时间:2013-06-10 23:24:15

标签: php

我正在创建一个类似于MySql自动增量的函数,但我使用的是值数组

$array = 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','P','Q','R','S','T','U','V','W','X','Y','Z',
               '1','2','3','4','5','6','7','8','9','0',
               '~',-','_');

我想根据这个数组得到下一个字符串。假设我有"aH?",所以我的下一个字符串应该是"aIa"或者我的字符串是"???"所以我的嵌套字符串应该是"aaaa"。请建议我最好和最快的方法。

4 个答案:

答案 0 :(得分:8)

我认为实际中最好的方法是在PHP中使用鲜为人知的自动增量属性:它也可以用于字符串:

$a = 'a';
echo ++$a; // 'b'
echo ++$a; // 'c'

$a = 'z';
echo ++$a; // 'aa'
echo ++$a; // 'ab'

$a = 'az';
echo ++$a; // 'ba'
echo ++$a; // 'bb'

$a = 'zz';
echo ++$a; // 'aaa'
echo ++$a; // 'aab'

事实上,人们甚至可以混合使用字母和数字,如下所示:

$ld = 'a9z9';
echo ++$ld; // 'b0a0'

$ld = 'z9z9';
echo ++$ld; // 'aa0a0'

如您所见,如果出现溢出(++9++z),下一个符号(从右到左)也会递增。如果它是最左边的(并且等于z),则它变为'aa'。

最后要说的是:案件得以保留。所以...

$mixin = 'Zz9Zz9Zz9';
echo ++$mixin; // 'AAa0Aa0Aa0'

答案 1 :(得分:2)

另一种选择是这样的(如果你只想让值自动递增然后显示):

<?php
// Set the value of the initial string:
$a = 'a';
// Set the value of the maximum string:
$zzz = 'zzz';
// "Assign $i to $a; while $i is less than the value of $zzz; auto-increment $i;"
for ($i = $a; $i < $zzz; $i++) {
  // Print the incremented value ($i)
  // Print an HTML break (<br/>) for screen formatting
  // Print a new line (\n) for when you view the source code
  print $i . "<br/>\n";
}
?>

答案 2 :(得分:0)

这可能不是处理它的最优雅的方法,但是如果你真的需要使用提供的数组,这个函数可以帮助你:

function getNext($s, $array) {
  static $remember;
  $last = substr($s, -1);
  $key = array_search($last, $array);
  if ($s === "") {
      $remember .= "a";
      return $remember; 
  } else if (isset($array[$key+1])) {
    return substr_replace($s, $array[$key+1], -1) . $remember;
  } else {
    $remember .= "a";
    return getNext(substr($s, 0, -1), $array);
  }
}

一些输出示例:

echo getNext("abcd", $array); //abce
echo getNext("??a?", $array); //??ba
echo getNext("???", $array); //aaaa
echo getNext("abc??", $array); //abdaa

答案 3 :(得分:0)

我喜欢Ziarno的代码,但如果您更喜欢非递归版本,那么我的代码是

function inc( $l_str ){
   $alpha = 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
   if( $l_str == '' ) return $alpha[0];
   $letters = array_reverse( str_split( $l_str ) );
   $carry = 1;
   foreach( $letters as $k=>$v ){
      if( $carry == 1 )
         $letters[$k] = $alpha[(array_search($v,$alpha)+1)%count($alpha)];
      if( $letters[$k] != $alpha[0] ) // new letter not an 'a'
         $carry = 0;
   }
   return ($carry == 1 ? $alpha[0] : '').implode(array_reverse($letters));
}