Подтвердить что ты не робот

Как увеличить буквы как цифры в PHP?

Я хотел бы написать функцию, которая принимает 3 символа и увеличивает его и возвращает вновь увеличивающиеся символы в виде строки.

Я знаю, как увеличить одну букву к следующей, но как узнать, когда увеличить буквы и затем остановить, а затем снова увеличить первую букву, чтобы иметь последовательное увеличение?

Итак, если AAA передан, верните AAB. Если AAZ передается обратно ABA (твердая часть).

Я был бы признателен за помощь в логике и какие функции php будут полезны для использования.

Еще лучше, некоторые сделали это уже или есть класс, доступный для этого?

Спасибо всем за помощь

4b9b3361

Ответ 1

Приращение символов/строк работает в PHP (хотя декремент не работает)

$x = 'AAZ';
$x++;
echo $x;

Ответ 2

Вы можете сделать это с помощью оператора ++.

$i = 'aaz';
$i++;
print $i;

ABA

Однако эта реализация имеет некоторые странные вещи:

for($i = 'a'; $i < 'z'; $i++) print "$i ";

Это напечатает буквы от a до y.

for($i = 'a'; $i <= 'z'; $i++) print "$i ";

Это напечатает lettes от a до z и продолжит с aa и заканчивается на yz.

Ответ 3

Как предложено в PHP RFC: Директива строгих операторов:

Использование функции приращения в строке вызовет ошибку TypeError, если для него включен strict_operators.

Пока неясно, будет ли объединен RFC. Но PHP рано или поздно пойдет в этом направлении, добавив строгость операторов. Следовательно, вы не должны увеличивать строки.

диапазоны az/AZ

Если вы знаете, что ваши буквы будут оставаться в диапазоне az/AZ (не превышающем z/Z), вы можете использовать решение, которое преобразует букву в код ASCII, увеличивает ее и преобразует обратно в букву.

Используйте ord() a chr():

$letter = 'A';
$letterAscii = ord($letter);
$letterAscii++;
$letter = chr($letterAscii); // 'B'
  1. ord() преобразует букву в представление ASCII num
  2. это числовое представление увеличивается
  3. с помощью chr() число конвертируется обратно в букву

Как обнаружено в комментариях, будьте осторожны. Это перебирает таблицу ASCII, поэтому из Z (ASCII 90) она не переходит в AA, а в [ (ASCII 91).

Выходя за пределы z/Z

Если вы решитесь пойти дальше и захотите, чтобы z стал aa, вот что я придумал:

final class NextLetter
{
    private const ASCII_UPPER_CASE_BOUNDARIES = [65, 91];
    private const ASCII_LOWER_CASE_BOUNDARIES = [97, 123];

    public static function get(string $previous) : string
    {
        $letters = str_split($previous);
        $output = '';
        $increase = true;

        while (! empty($letters)) {
            $letter = array_pop($letters);

            if ($increase) {
                $letterAscii = ord($letter);
                $letterAscii++;
                if ($letterAscii === self::ASCII_UPPER_CASE_BOUNDARIES[1]) {
                    $letterAscii = self::ASCII_UPPER_CASE_BOUNDARIES[0];
                    $increase = true;
                } elseif ($letterAscii === self::ASCII_LOWER_CASE_BOUNDARIES[1]) {
                    $letterAscii = self::ASCII_LOWER_CASE_BOUNDARIES[0];
                    $increase = true;
                } else {
                    $increase = false;
                }

                $letter = chr($letterAscii);
                if ($increase && empty($letters)) {
                    $letter .= $letter;
                }
            }

            $output = $letter . $output;
        }

        return $output;
    }
}

Я также предоставлю вам 100% покрытие, если вы намерены работать с ним дальше:

    /**
     * @dataProvider letterProvider
     */
    public function testIncrementLetter(string $givenLetter) : void
    {
        $expectedValue = $givenLetter;

        self::assertSame(++$expectedValue, NextLetter::get($givenLetter));
    }

    /** 
     * @return iterable<string>
     */
    public function letterProvider() : iterable
    {
        yield ['A'];
        yield ['a'];
        yield ['z'];
        yield ['Z'];
        yield ['aaz'];
        yield ['aaZ'];
        yield ['abz'];
        yield ['abZ'];
    }

Ответ 4

Вы смотрите на проблему с числом представлений. Это base24 (или сколько бы ни было число ваших алфавитов). Позволяет вызвать базу b.

Назначьте число каждой букве в алфавите (A = 1, B = 2, C = 3).

Далее, укажите свой номер "число": представление "ABC" означает A*b^2 + B*b^1 + C*b^0 Используйте эту формулу, чтобы найти номер (int). Увеличьте его.

Затем переведите его обратно в свою цифровую систему: разделите на b^2, чтобы получить третью цифру, остаток (по модулю) на b^1 для второй цифры, остаток (по модулю) на `b ^ 0 ^ для последней цифры.

Это может помочь: Как конвертировать из base10 в любую другую базу.

Ответ 5

У меня есть эти методы в С#, которые вы, вероятно, могли бы преобразовать в php и изменить в соответствии с вашими потребностями, я не уверен, что Hexavigesimal является точным именем для них, хотя...

#region Hexavigesimal (Excel Column Name to Number)
public static int FromHexavigesimal(this string s)
{
    int i = 0;
    s = s.Reverse();
    for (int p = s.Length - 1; p >= 0; p--)
    {
        char c = s[p];
        i += c.toInt() * (int)Math.Pow(26, p);
    }

    return i;
}

public static string ToHexavigesimal(this int i)
{
    StringBuilder s = new StringBuilder();

    while (i > 26)
    {
        int r = i % 26;
        if (r == 0)
        {
            i -= 26;
            s.Insert(0, 'Z');
        }
        else
        {
            s.Insert(0, r.toChar());
        }

        i = i / 26;
    }

    return s.Insert(0, i.toChar()).ToString();
}

public static string Increment(this string s, int offset)
{
    return (s.FromHexavigesimal() + offset).ToHexavigesimal();
}

private static char toChar(this int i)
{
    return (char)(i + 64);
}

private static int toInt(this char c)
{
    return (int)c - 64;
}
#endregion

ИЗМЕНИТЬ

Я вижу по другим ответам, что в PHP вы можете использовать ++ вместо этого, nice!

Ответ 6

Вы можете использовать коды ASCII для альфа-чисел. Оттуда вы увеличиваете и уменьшаете, чтобы получить предыдущий/следующий символ.

Вы можете разделить строку на отдельные символы, а затем применить преобразования к этим символам.

Только некоторые мысли, чтобы вы начали.

Ответ 7

 <?php 
$values[] = 'B';
$values[] = 'A';
$values[] = 'Z';
foreach($values as $value ){
  if($value == 'Z'){ 
       $value = '-1';
    }
$op = ++$value;
echo $op;
}
?>