2010-04-20 2 views

ответ

101

Наиболее эффективный способ сделать это в мой взгляд на просто увеличиваем строковой переменной.

$str = 'a'; 
echo ++$str; // prints 'b' 

$str = 'z'; 
echo ++$str; // prints 'aa' 

Как видно приращение 'z' дает 'aa', если вы не хотите этого, но вместо этого хочет сбросить, чтобы получить 'a' вы можете просто проверить длину результирующей строки, и если его >1 сбросить его.

$ch = 'a'; 
$next_ch = ++$ch; 
if (strlen($next_ch) > 1) { // if you go beyond z or Z reset to a or A 
$next_ch = $next_ch[0]; 
} 
+0

@Mathias была небольшая ошибка с смешиванием pre и post incrementing. Измените его на '$ b = ++ $ a;' – nickf

+0

@Mathias: Мой плохой ... вы должны использовать pre-increment как: '$ b = ++ $ a;' @nickf: Спасибо :) – codaddict

+0

Ваш неверно. '$ next_ch = $ ch ++;' не будет хранить добавочное значение в '$ next_ch', но * будет * фактически увеличивать' $ ch'. Смущала меня там в течение секунды :) Большой совет, хотя, я не знал, что это было возможно. Определенно, самый эффективный способ сделать это! –

8

Ну, это зависит от того, что именно вы хотите делать с «краевыми случаями». Какой результат вы ожидаете, когда персонаж z или Z? Вы хотите следующую букву того же случая, или просто следующее письмо, период?

Не зная ответ на этот вопрос, по очень простому случаю, вы можете просто сделать это:

$next_character = chr(ord($current_character) + 1); 

Но когда вы на Z это даст вам [ и z даст вам {, согласно значениям ASCII.


Edited согласно комментарий:

Если вам нужен следующий символ того же дела, вероятно, можно просто добавить простые проверки после строки выше:

if ($next_character == '[') 
    $next_character = 'A'; 
else if ($next_character == '{') 
    $next_character = 'a'; 

Это очень простые операции, я действительно не стал бы беспокоиться об эффективности в таком случае.

+0

Я хочу следующее письмо с тем же случаем. Если символ 'z', я ожидаю' a'. –

+0

Не было бы быстрее просто возвращать 'A' или' a' сразу, когда символ 'Z' или' z'? –

14

Это зависит от того, что вы хотите делать, когда вы нажмете Z, но у вас есть несколько вариантов:

$nextChar = chr(ord($currChar) + 1); // "a" -> "b", "z" -> "{" 

Вы также могли бы использовать range() функции РНР:

$chars = range('a', 'z'); // ['a', 'b', 'c', 'd', ...] 
5

Как насчет используя ord() and chr()?

<?php 
    $next = chr(ord($prev)+1); 
?> 
+0

Короткие и сладкие! Но как насчет крайних случаев ('z' должен возвращать' a')? Есть ли лучший способ проверить это, кроме выражения 'if()'? –

+1

$ next = ($ prev == 'z')? 'a': chr (ord ($ prev) +1); – Anax

+0

Спасибо за это тоже @Anax – Jamus

3

Поскольку я забочусь только о строчных символов в этом случае, я буду использовать следующий код, основанный на ответах, размещенных здесь:

function nextLetter(&$str) { 
$str = ('z' === $str ? 'a' : ++$str); 
} 

Спасибо за помощь, ребята!

3
$val = 'z'; 
echo chr((((ord($val) - 97) + 1) % 26) + 97); 

Приятный и удобный :-)

+0

, а для 'Z' это '$ next = chr (((ord ($ c) - 65) + 1)% 26) + 65); 'ie ord ('A') – loretoparisi

0

Создать массив из всех букв, поиск существующего письма и возвращает следующую букву. Если вы дойдете до последней буквы, верните первую букву.