Автоматическое увеличение уникального URL - PullRequest
1 голос
/ 06 августа 2010

Я хочу создать автоматически увеличивающуюся уникальную строку с использованием PHP, содержащую [a-Z 0-9], начиная с длины 2 символов и увеличивая при необходимости.

Это для сокращения URL, поэтому каждая строка (или псевдоним) будет сохранена в базе данных, прикрепленной к URL.

Любое понимание будет с благодарностью!

Ответы [ 4 ]

2 голосов
/ 06 августа 2010

Обратите внимание, что это решение не будет производить заглавные буквы.

Используйте base_convert() для преобразования в базу 36, которая будет использовать [a-z0-9].

<?php
// outputs a, b, c, ..., 2o, 2p, 2q
for ($i = 10; $i < 99; ++$i)
  echo base_convert($i, 10, 36), "\n";

Учитывая последнее использованное число, вы можете преобразовать его обратно в целое число с intval() увеличить его и преобразовать результат обратно в базу 36 с помощью base_convert().

<?php

$value = 'bc9z';
$value = intval($value, 36);
++$value;
$value = base_convert($value, 10, 36);
echo $value; // bca0

// or
echo $value = base_convert(intval($value, 36) + 1, 10, 36);
0 голосов
/ 06 августа 2010

Вот реализация функции incr, которая берет строку, содержащую символы [0-9a-zA-Z], и увеличивает ее, толкая 0 вперед, если требуется, используя метод carry-the-one.

<?php

function incr($num) {
  $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $parts = str_split((string)$num);

  $carry = 1;
  for ($i = count($parts) - 1; $i >= 0 && $carry; --$i) {
    $value = strpos($chars, $parts[$i]) + 1;
    if ($value >= strlen($chars)) {
      $value = 0;
      $carry = 1;
    } else {
      $carry = 0;
    }
    $parts[$i] = $chars[$value];
  }

  if ($carry)
    array_unshift($parts, $chars[0]);

  return implode($parts);
}

$num = '0';
for ($i = 0; $i < 1000; ++$i) {
  echo $num = incr($num), "\n";
}
0 голосов
/ 06 августа 2010

Чтобы расширить ответ meagar, вот как вы можете сделать это с заглавными буквами и для произвольно большого числа (требуется расширение bcmath , но вы также можете использовать пакет gmp или bigintegers pear ):

function base10ToBase62($number) {
    static $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $result = "";
    $n = $number;
    do {
        $remainder = bcmod($n, 62);
        $n = bcdiv($n, 62);
        $result = $chars[$remainder] . $result;
    } while ($n > 0);

    return $result;
}

for ($i = 10; $i < 99; ++$i) {
    echo base10ToBase62((string) $i), "\n";
}
0 голосов
/ 06 августа 2010

Если ваша строка была одиночной, а не смешанной, и не содержала чисел, то вы могли бы буквально просто увеличить ее:

$testString="AA";
for($x = 0; $x < 65536; $x++) {
    echo $testString++.'<br />';
}

$testString="aa";
for($x = 0; $x < 65536; $x++) {
    echo $testString++.'<br />';
}

Но вы могли бы использовать эту функцию, даже используясмешанная буквенно-цифровая строка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...