0

我正在制作一个类似于 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

4 回答 4

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'
于 2013-06-10T23:32:18.250 回答
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";
}
?>
于 2013-06-10T23:47:03.467 回答
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
于 2013-06-11T00:35:59.570 回答
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));
}
于 2013-06-11T03:28:24.607 回答