За последние 24 часа нас посетили 40960 программистов и 1813 роботов. Сейчас ищут 875 программистов ...

инкремент текста

Тема в разделе "PHP для новичков", создана пользователем akeelow, 16 июн 2013.

  1. akeelow

    akeelow Активный пользователь

    С нами с:
    10 апр 2012
    Сообщения:
    58
    Симпатии:
    0
    Есть ли в php функция инкремента текста? Например:
    1. инкремент('aa') выведет "ab"
    2. инкремент('ab') выведет "ac"
    3. инкремент('az') выведет "ba"
    4. инкремент('zz') выведет "aaa"
    5. инкремент('a1') выведет "a2"

    И тому подобное?
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    php.net/manual/ru/language.operators.increment.php
     
  3. akeelow

    akeelow Активный пользователь

    С нами с:
    10 апр 2012
    Сообщения:
    58
    Симпатии:
    0
    Не совсем то. Она инкременирует символы по позициям и только в том диапазоне, в котором символ находится. т.е. инкрементируя строку "ааа" никогда не получишь строку "999" или "FFF"
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Что не то? Я не говорил что это то:)

    Встроенной возможности я не знаю.Знаю только то что я привел.А дальше тебе надо думать и писать.
     
  5. akeelow

    akeelow Активный пользователь

    С нами с:
    10 апр 2012
    Сообщения:
    58
    Симпатии:
    0
    Наверно извращенный способ, но на первый взгляд работает:
    Код (PHP):
    1. <?php
    2.     $text = "0123456789";
    3.     $code = "199";
    4.  
    5.     function inct($str, $value)
    6.     {
    7.         $key = substr($value, -1);
    8.         $newValue = substr($value, 0, -1);
    9.         $valuePos = strpos($str, $key);
    10.         if (($newKey = substr($str, $valuePos + 1, 1)) == false) 
    11.         {
    12.             $newKey = $str[0];
    13.             $newValue = inct($str, substr($value, 0, -1));
    14.         }
    15.         return $newValue.$newKey;
    16.     }
    17.     echo inct($text, $code);
    18. ?>
    Смысл такой, есть шкала символов $text согласно ей я пытаюсь инкрементировать слово $code. Беру последний символ слова, смотрю его позицию в тексте, беру следующий по счету символ и меняю его в слове. Если символов больше нет, беру начальный символ, и снова вызываю эту функцию. как так.

    Помогите придумать способ потестировать его?

    Может можно как-то упростить?
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  7. akeelow

    akeelow Активный пользователь

    С нами с:
    10 апр 2012
    Сообщения:
    58
    Симпатии:
    0
    Опять мне не подходит или я не до конца разобрался в ней.

    Может если я объясню для чего мне это, станет понятнее
    Нужно генерировать уникальную строку, чем короче тем лучше. Рассматривал варианты:
    Вариант 1. Выбрать строку размером 5 символов, генерить, проверить есть ли в базе, если что сгенерить заново (длина достаточна, что бы не приходилось повторно генерить слишком часто)
    Вариант 2. Взять короткую строку 2-3 символа. И следить за базой в ручную. Как только наберется определенное количество строк, увеличить длину строки на один.
    Вариант 3. То что я и попытался сделать. Задал список возможных символов "0123456789bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ". Наверно можно сказать создал свою системой счисления :) И просто увеличиваю строку на один порядок.

    хз, как это решают нормальные люди, но вариант вроде работает, протестировал как мог.
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    есть. попробуйте)
     
  9. akeelow

    akeelow Активный пользователь

    С нами с:
    10 апр 2012
    Сообщения:
    58
    Симпатии:
    0
    Покажи мне функцию, которая из текста "199" сделает текст "200" или из "99" сделает "100"?
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    во-первых я показал такую функцию

    во-вторых, а че надо-то изначально?
     
  11. akeelow

    akeelow Активный пользователь

    С нами с:
    10 апр 2012
    Сообщения:
    58
    Симпатии:
    0
    Уже ничего, моя функция устраивает. можно закрывать тему :)
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не, я не к тому что "чего или ничего".
    просто обычно такие подходы рождаются от незнания, и это из серии изобретения велосипедов.

    ты зачем хотел считать эти буковки? может есть способ проще. ты расскажи.
     
  13. akeelow

    akeelow Активный пользователь

    С нами с:
    10 апр 2012
    Сообщения:
    58
    Симпатии:
    0
    сокращатель ссылок делаю, нужны короткие слова, но как то они все будут заняты, увеличить длину на один символ и т.д.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    мммм
    ну есть проблема - запросить из базы последний номер =)
     
  15. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ты уже определись что тебе надо.
    сделать из "199" сделает текст "200" несложно, это цифры, хоть и в строке
    Код (PHP):
    1. echo (string)(1+'199');
    Другое дело инкремент для строки типа "abc'. но и тут php не подведет. он такое поддерживает. это делается не абы как, а по вполне конкретному алгоритму. вуаля:
    Код (PHP):
    1. $s = 'a';
    2. foreach(range(0,1000) as $v) {
    3.     $s++;
    4.     echo $s.'<br />';
    5. }
    а если говорить о Начальной задаче - формировании коротких ссылок. то делается это по разному, иногда так:
    Код (PHP):
    1. // конвертируем десятичное число в 62-ричное
    2. function base10to62($in) {
    3.     $a = array_merge( range(0, 9), range('a', 'z'), range('A', 'Z') );
    4.     $base = sizeof($a);
    5.     $h = '';
    6.     while($in>=$base) {
    7.         $d1 = floor($in/$base);
    8.         $ost = $in-$d1*$base;
    9.         $in = $d1;
    10.         $h .= $a[$ost];
    11.     }
    12.     return strrev($h.$a[$in]);
    13. }
    14. echo base10to62(65455); // h1J   
    тоесть ссылки просто хранятся в БД и каждая имеет свой автоинкрементальное десятичное число, а для каждого из них мы всегда можем получить короткий код, в 62-ричной системе счисления, можем комбинацию их и т.д.
     
  16. akeelow

    akeelow Активный пользователь

    С нами с:
    10 апр 2012
    Сообщения:
    58
    Симпатии:
    0
    C первым понятно, не то имел ввиду, цифры складывать умею :)

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

    Третий вариант похож на то что мне надо, но что там происходит понятия не имею, так глубоко php не знаю :)
     
  17. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А зачем?
     
  18. akeelow

    akeelow Активный пользователь

    С нами с:
    10 апр 2012
    Сообщения:
    58
    Симпатии:
    0
    Так я тебе и сказал, может еще объяснит откуда там деньги? :)
     
  19. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Гугл сговорчивей тебя :)

    Не отказался бы:) В интернете много бесплатных ресурсов предоставляющих подобную услугу.
    На чем ты собираешься деньги делать не понимаю.
     
  20. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    будущий милиардер детектед.
    на кор.ссылках поднимется. а дальше уже гостевыми книгами ворочать начнет. там уже другие масштабы...
     
  21. akeelow

    akeelow Активный пользователь

    С нами с:
    10 апр 2012
    Сообщения:
    58
    Симпатии:
    0
    Не, буду писать книги "Как заработать миллион"