2010-04-20 5 views

Antwort

101

Der effizienteste Weg, diese Meinung in meiner tut, ist zu nur das String-Variable zu erhöhen.

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

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

Wie 'z' gibt 'aa' gesehen erhöht wird, wenn Sie das nicht wollen, sondern zurücksetzen möchte ein 'a' Sie die Länge des resultierenden Strings überprüfen können einfach zu bekommen, und wenn seine >1 es zurückgesetzt.

$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 gab es einen kleinen Fehler beim Mischen der Vor- und Nachinkrementierung. Ändern Sie es in '$ b = ++ $ a;' – nickf

+0

@Mathias: Meine schlechte ... Sie sollten Pre-Inkrement als verwenden: '$ b = ++ $ a;' @nickf: Danke :) – codaddict

+0

Ihre Codebeispiel ist falsch. '$ next_ch = $ ch ++;' speichert den inkrementierten Wert nicht in '$ next_ch', aber * wird * tatsächlich '$ ch' erhöhen. Verwirrt mich für eine Sekunde :) Toller Tipp, ich wusste nicht, dass das überhaupt möglich war. Definitiv der effizienteste Weg! –

8

Nun, es hängt davon ab, was genau Sie mit den "Rand Fällen" tun wollen. Welches Ergebnis erwarten Sie, wenn das Zeichen z oder Z ist? Möchten Sie den nächsten Brief des gleichen Falls oder nur den nächsten Buchstaben, Punkt?

Ohne die Antwort darauf zu wissen, für den sehr einfachen Fall können Sie nur dies tun:

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

Aber wenn man sich Z ist wird diesen Ihnen [ geben, und z geben Ihnen {, nach ASCII-Werten.


Edited per Kommentar:

Wenn Sie das nächste Zeichen des gleichen Fall benötigen, können Sie wahrscheinlich fügen Sie einfach einfache Überprüfungen nach der Zeile oben:

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

Dies sind sehr einfache Operationen, ich würde mir in einem solchen Fall keine Gedanken um Effizienz machen.

+0

Ich möchte den nächsten Brief mit dem gleichen Fall. Wenn das Zeichen "z" ist, erwarte ich "a". –

+0

Wäre es nicht schneller, "A" oder "a" sofort zurückzugeben, wenn das Zeichen "Z" oder "Z" ist? –

14

Es hängt davon ab, was Sie tun möchten, wenn Sie Z getroffen, aber Sie haben ein paar Optionen:

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

Sie auch die Verwendung von PHP range() Funktion machen könnte:

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

Wie wäre es mit ord() and chr()?

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

Kurz und süß! Aber was ist mit den Randfällen ('z' sollte' a' zurückgeben)? Gibt es einen besseren Weg dies zu überprüfen als eine 'if()' Aussage? –

+1

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

+0

Danke auch dafür @Anax – Jamus

3

Da ich über Kleinbuchstaben in diesem Fall nur kümmern, werde ich den folgenden Code verwenden, auf der Grundlage der hier gepostet Antworten:

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

Danke für die Hilfe, Jungs!

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

Nice and easy :-)

+0

und für 'Z' ist es $ Next = chr (((ord ($ c) - 65) + 1)% 26) + 65); 'dh ord ('A') – loretoparisi

0

ein Array aller Buchstaben erstellen, für die bestehenden Buchstaben suchen und ihren nächsten Brief zurück. Wenn Sie den letzten Buchstaben erreichen, geben Sie den ersten Buchstaben zurück.

Verwandte Themen