2011-02-05 2 views
0

Я хочу сделать функцию, как этот пример:Как я могу сделать «число» со строкой в ​​PHP?

следующими («ABC») возвращают «АС» - это следующая строка с 3 единицами

Это как у нас есть цифры от 0 до 9 и функция возвращает номер следующего

Next2 (135) возвращает 136 - это следующий номер с 3 цифрами

Мы используем систему основанию 10 для чисел апа я хочу использовать numbersletters это означает, что база-36 системы и получить следующий так называемый номер

Приятное спасибо!

+2

Почему 'ABC' рядом с' ACA'? Я не понимаю. Можете ли вы рассказать о системе, которую хотите использовать? –

+1

Это базовая система номер 3, использующая A B C вместо 0 1 2 в качестве цифр. –

+0

@ Да, ах, конечно (я читал 'ABA', это рано утром). Спасибо –

ответ

2

Вот функция, которая производит следующее значение в вашей Base3 буквенной системы счисления:

function nextval($input, $pad = 1) { 

     $map = array(0 => 'A', 1 => 'B', 2 => 'C'); 

     //convert letters to numbers 
     $num = ''; 
     for ($i = 0; $i < strlen($input); $i++) { 
       $num .= array_search($input{$i}, $map); 
     } 

     //convert the number to base 10, then add 1 to it 
     $base10 = base_convert($num, 3, 10); 
     $base10++; 

     //convert back to base 3 
     $base3 = base_convert($base10, 10, 3); 

     //swap the digits back to letters 
     $num = ''; 
     for ($i = 0; $i < strlen($base3); $i++) { 
       $num .= $map[$base3{$i}]; 
     } 

     //pad with leading A's 
     while (strlen($num) < $pad) { 
       $num = 'A' . $num; 
     } 

     return $num; 

} 

echo nextval('ABC', 3); //ACA 

Обратите внимание, что результат «СА», как «АС» является так же, как писать «06» в базе 10 ... мы обычно не пишем ведущие нули, чтобы вы не писали ведущие «А».

Поэтому я добавил параметр пэда, который позволяет указать, сколько цифр вы хотите отложить. С $pad=3 вы получаете «ACA» как следующий от «ABC».

0

Один из способов, которым я мог подумать прямо сейчас, - это преобразование символов в base26, а затем добавление 1 к числу и преобразование его обратно, надеюсь, вы получите эту идею. Next2 должен делать то же самое, но с base10, который по умолчанию является таким, чтобы я был всего лишь +1 к самому числу. С нетерпением ждем других реализаций на этом.

Редактировать: Не заметил, что у вас был A в конце. глупо меня из меня, чтобы сделать это. что бы Base3 тогда вместо 26.

1

Что-то вроде этого

<?php 

function toNext($input) { 
    $conv = strtr(strtolower($input), array(
     'a' => '0', 
     'b' => '1', 
     'c' => '2')); 
    $conv = base_convert($conv, 3, 10); 
    $conv++; 
    $output = base_convert($conv, 10, 3); 
    $output = sprintf("%03d", $output); 
    $output = strtr((string) $output, array(
     '0' => 'a', 
     '1' => 'b', 
     '2' => 'c')); 
    return strtoupper($output); 
} 


var_dump(toNext('ABC')); 
var_dump(toNext('ABA')); 
+0

Спасибо большое, это именно то, что я хочу, добавьте остальные буквы до тех пор, пока не будет z – Mario

+0

Это полностью изменяет ваш вопрос, и ACA не приходит после ABC, если есть более 3 букв ... Я уверен, что многие люди будут расстроены, они потратили время на запись всего этого кода для вас, если вы измените всю систему номеров ... –

+0

У меня был неверный пример, я хочу сделать простой пример, а затем применить код для меня – Mario

0

Эти функции ручного преобразования базы не страдают от неточностей встроенных в них.

<?php 
function next($str) 
    { 
    $baseDec = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'); 
    $baseAln = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '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'); 
    return base_conv((string) ((int) base_conv($str, $baseAln, $baseDec) + 1), $baseDec, $baseAln); 
    } 



function base_conv_str($valStr, $baseToStr, $baseFromStr) 
    { 
    $baseTo = str_split($baseToStr); 
    $baseFrom = str_split($baseFromStr); 
    return base_arr_to_str(base_conv_arr(base_str_to_arr((string) $valStr, $baseFrom), count($baseTo), count($baseFrom)), $baseTo); 
    } 

function base_conv($valStr, &$baseTo, &$baseFrom) 
    { 
    return base_arr_to_str(base_conv_arr(base_str_to_arr((string) $valStr, $baseFrom), count($baseTo), count($baseFrom)), $baseTo); 
    } 

function base_conv_arr($val, $baseToDigits, $baseFromDigits) 
    { 
    $valDigits = count($val); 
    $result = array(); 
    do 
     { 
     $divide = 0; 
     $newlen = 0; 
     for ($i = 0; $i < $valDigits; ++$i) 
      { 
      $divide = $divide * $baseFromDigits + $val[$i]; 
      if ($divide >= $baseToDigits) 
       { 
       $val[$newlen ++] = (int) ($divide/$baseToDigits); 
       $divide = $divide % $baseToDigits; 
       } 
      else if ($newlen > 0) 
       { 
       $val[$newlen ++] = 0; 
       } 
      } 
     $valDigits = $newlen; 
     array_unshift($result, $divide); 
     } 
     while ($newlen != 0); 
    return $result; 
    } 

function base_arr_to_str($arr, &$base) 
    { 
    $str = ''; 
    foreach ($arr as $digit) 
     { 
     $str .= $base[$digit]; 
     } 
    return $str; 
    } 

function base_str_to_arr($str, &$base) 
    { 
    $arr = array(); 
    while ($str === '0' || !empty($str)) 
     { 
     foreach ($base as $index => $digit) 
      { 
      if (mb_substr($str, 0, $digitLen = mb_strlen($digit)) === $digit) 
       { 
       $arr[] = $index; 
       $str = mb_substr($str, $digitLen); 
       continue 2; 
       } 
      } 
     throw new Exception(); 
     } 
    return $arr; 
    } 
?> 
+0

Неустранимая ошибка: исключение исключений «Исключение» – Mario

+0

@Mario: Это означает, что ваша строка ввода содержит цифры, отсутствующие в базе (и 'base_str_to_arr()' не выполняет декодирование строки). Возможно, ваш ввод содержит строчные буквы. Обратите внимание, что я определил базу-36 как '0-9A-Z' в' next() '. Измените это на свои предпочтения. –

0

Согласно Вашему комментарию к ответу Xavier Барбосов, если вы хотите использовать все буквы from a to z вы можете сделать:

$str = 'ajz'; 
echo ++$str,"\n"; 

отпечатывается: aka

+0

Но он хочет base36, поэтому ajz + 1 should = ak0 – Petah

+0

@Petah: OP изменил свой запрос после того, как я отправил свой ответ, поэтому я не знал о base36. – Toto

-2

Чтобы получить следующее число base36 использование:

function next_base36($n) { 
    $n = base_convert($n, 36, 10); 
    return base_convert($n + 1, 10, 36); 
} 
Смежные вопросы