PHP Увеличение буквенно-цифровой строки

Я работаю над страницей, где пользователь увидит таблицу, использующую таблицы данных с набором своих данных. У них должна быть возможность поставить свою собственную нумерацию, это могут быть только цифры или буквенно-цифровые символы, а также приращение.

Таким образом, у него будет два входа: один для начального числа, которое может быть любым: 1, A01, 01, A01M, и этот список можно продолжить. Так что комбинации могут быть бесконечными.

И этот список можно продолжить, теперь самое сложное — это приращение. Пользователь должен иметь возможность установить любое числовое приращение, и, поскольку в конце могут быть символы, которые не должны изменяться, $n++ для увеличения буквенно-цифровой строки здесь не будет работать.

Я гуглил, но единственные, которые я нашел, предназначены для конкретных случаев или для автоинкремента с использованием ++.

Любая помощь будет здорово.


person Federico Giust    schedule 14.08.2014    source источник
comment
Пробовали использовать префикс, суффикс, а затем автоинкремент? Это работает? например, «A01» — это префикс, а «M» — это суффикс для серии, затем вы добавляете n-значное число между ними, которое увеличивается. Возможно, вам придется использовать другую таблицу для обслуживания этой серии, если это MySQL.   -  person mishka    schedule 14.08.2014
comment
Если я правильно вас понял, вы можете использовать регулярное выражение, чтобы получить числа, увеличить их и вернуть обратно в строку.   -  person Robert    schedule 14.08.2014
comment
@Robert Звучит так, как я мог бы в конечном итоге пойти, но я ужасен с RegEx.   -  person Federico Giust    schedule 14.08.2014


Ответы (3)


Если вы не чувствительны к регистру, вы можете использовать base_convert($string, 36,10). Это преобразует строку в int (учитывая, что строка является числом в базе 36).

$var = base_convert('azz',36,10);
echo base_convert($var,10,36).PHP_EOL; $var+=1;
echo base_convert($var,10,36).PHP_EOL; $var+=1;
echo base_convert($var,10,36).PHP_EOL;

Дам тебе :

azz
b00
b01

Но имейте в виду, что 6 символов уже дадут вам 36 ^ 6-1 ~ 2 миллиарда возможностей, что примерно равно значению простого целого числа!

person Faquarl    schedule 22.04.2016

В PHP вы можете использовать preg_replace_callback():

function increment($string)
{
   return preg_replace_callback('/^([^0-9]*)([0-9]+)([^0-9]*)$/', function($m)
   {
      return $m[1].str_pad($m[2]+1, strlen($m[2]), '0', STR_PAD_LEFT).$m[3];
   }, $string);
}

str_pad() необходим, так как у нас могут быть ведущие нули, которые важны, если речь идет о строках. Некоторые примеры:

var_dump(increment('2000000000'));//string(10) "2000000001"
var_dump(increment('A040'));      //string(4) "A041"
var_dump(increment('A15MM'));     //string(5) "A16MM"
var_dump(increment('PY999LKD'));  //string(9) "PY1000LKD" 

Обратите внимание, что эта функция оставит неоднозначные случаи нетронутыми:

var_dump(increment('N008P91F'));  //string(8) "N008P91F"
person Alma Do    schedule 14.08.2014
comment
В PHP 5.2 это будет: function increment($string) { function subfunc($m) { return $m[1].str_pad($m[2]+1, strlen($m[2]), '0', STR_PAD_LEFT).$m[3]; } return preg_replace_callback('/^([^0-9]*)([0-9]+)([^0-9]*)$/', 'subfunc', $string); } - person user323094; 09.02.2015

это регулярное выражение также должно работать '/\d+/'

person hi im zvaehn    schedule 14.08.2014