Я хотел бы написать функцию, которая принимает 3 символа и увеличивает его и возвращает вновь увеличивающиеся символы в виде строки.
Я знаю, как увеличить одну букву до следующей, но как я узнаю, когда увеличить буквы, а затем остановить, а затем увеличить первую букву, чтобы получить последовательное увеличение?
Поэтому, если AAA передан, верните AAB. Если AAZ передается обратно ABA (твердая часть).
Я был бы признателен за помощь в логике и какие функции php будут полезны для использования.
Еще лучше, некоторые сделали это уже или есть класс, доступный для этого?
Спасибо всем за любую помощь
Приращение символов / строк работает в PHP (хотя декремент не работает)
$x = 'AAZ'; $x++; echo $x;
Вы можете сделать это с помощью оператора ++.
$i = 'aaz'; $i++; print $i;
аба
Однако эта реализация имеет некоторые странные вещи:
for($i = 'a'; $i < 'z'; $i++) print "$i ";
Это напечатает буквы от a
до y
.
for($i = 'a'; $i <= 'z'; $i++) print "$i ";
Это будет печатать lettes от a
до z
и оно продолжается с aa
и заканчивается на yz
.
Вы смотрите на проблему с числом представлений. Это 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 в любую другую базу .
У меня есть эти методы в c #, которые вы, вероятно, могли бы преобразовать в 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 вы можете использовать ++
вместо этого, хорошо!
Вы можете использовать коды ASCII для альфа-чисел. Оттуда вы увеличиваете и уменьшаете, чтобы получить предыдущий / следующий символ.
Вы можете разделить строку на отдельные символы, а затем применить преобразования к этим символам.
Просто некоторые мысли, чтобы вы начали.
<?php $values[] = 'B'; $values[] = 'A'; $values[] = 'Z'; foreach($values as $value ){ if($value == 'Z'){ $value = '-1'; } $op = ++$value; echo $op; } ?>