2010-04-21 14 views
344

Ich muss das letzte Zeichen einer Zeichenfolge abrufen. Angenommen, ich habe "Tester" als Eingabezeichenfolge und möchte, dass das Ergebnis "s" ist. Wie kann ich das in PHP machen?Wie bekomme ich das letzte Zeichen einer Zeichenkette in PHP?

+0

Siehe meine Antwort unten für diese Funktion in 7.1 von PHP. – RyanNerd

+0

Sie könnten ['s ($ str) -> end()'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L192) hilfreich finden, da gefunden in [diese eigenständige Bibliothek] (https://github.com/delight-im/PHP-Str). – caw

Antwort

714
substr("testers", -1); // returns "s" 
+89

Wenn Sie Multibyte-Zeichencodierungen wie UTF-8 verwenden, verwenden Sie' mb_substr' (http://php.net/ mb_substr) statt. – Gumbo

+5

so viel für meine substr ($ string, strlen ($ string) -1, 1) ;. Es scheint, ich habe den langen Weg genommen! – jeffkee

+3

Sie benötigen nur Multibyte-String-Funktionen, wenn die Zeichenfolge als binäre Zeichenfolge ausgewertet wird. Aka, wenn PHP die Codierung nicht kennt. Ansonsten funktionieren die typischen Nicht-Multibyte-String-Funktionen gut. –

55
substr($string, -1) 
+2

Es gibt keine PHP-Funktion namens "substring", Sie erhalten einen Fehler, wenn Sie nicht Ihre eigene Teilzeichenfolgefunktion erstellt haben. Sollte "substr" sein. –

+21

ahh du verderst den ganzen Witz. +8 Voting für die falsche Antwort sieht einfach toll aus :) –

+2

duh ... ich meinte 'substr' natürlich – knittl

52

Oder von direct string access:

$string[strlen($string)-1]; 

Beachten Sie, dass dies nicht für Multibyte-Strings funktioniert. Wenn Sie mit Multibyte-String arbeiten müssen, sollten Sie die Verwendung von mb_* string family of functions.

+2

Ich mag diese C-Stil Antwort, ich frage mich, warum das nur diese paar Upvotes hat. –

+13

@ValentinMercier: Da dies eine PHP-Frage ist, haben nicht C. –

+2

@ValentinMercier ... und _only_ C-Programmierer einen _contest_ für verwirrenden Code! http://ioccc.org/ – Slashback

3

Denken Sie daran, wenn Sie eine Zeichenfolge haben, die als eine Linie aus einer Textdatei gelesen wurde mit der fgets() Funktion, müssen Sie substr($string, -3, 1) so bedienen, dass Sie die tatsächliche bekommen Zeichen und nicht Teil der CRLF (Carriage Return Line Feed).

Ich glaube nicht, dass die Person, die die Frage gestellt hat, diese benötigt, aber für mich hatte ich Probleme, das letzte Zeichen aus einer Zeichenfolge aus einer Textdatei zu bekommen, so dass andere ähnliche Probleme haben werden.

14

Ich kann keine Kommentare hinterlassen, aber in Bezug auf FastTrack's Antwort, auch daran denken, dass die Zeilenendung nur ein einzelnes Zeichen sein kann. Ich würde

substr(trim($string), -1) 

EDIT vorschlagen:Mein Code unten von jemandem bearbeitet wurde, so dass es nicht tun, was ich angegeben. Ich habe meinen ursprünglichen Code wiederhergestellt und den Wortlaut geändert, um ihn klarer zu machen.

trim (oder rtrim) wird entfernen alle Leerzeichen, wenn Sie also für einen Raum, Reiter oder andere Leerzeichen überprüfen müssen, ersetzen Sie manuell die verschiedenen Zeilenenden zuerst:

$order = array("\r\n", "\n", "\r"); 
$string = str_replace($order, '', $string); 
$lastchar = substr($string, -1); 
4

I ‚d Beratung für Gordon-Lösung zu gehen, wie es performanter als substr() ist:

<?php 

$string = 'abcdef'; 
$repetitions = 10000000; 

echo "\n\n"; 
echo "----------------------------------\n"; 
echo $repetitions . " repetitions...\n"; 
echo "----------------------------------\n"; 
echo "\n\n"; 

$start = microtime(true); 
for($i=0; $i<$repetitions; $i++) 
    $x = substr($string, -1); 

echo "substr() took " . (microtime(true) - $start) . "seconds\n"; 

$start = microtime(true); 
for($i=0; $i<$repetitions; $i++) 
    $x = $string[strlen($string)-1]; 

echo "array access took " . (microtime(true) - $start) . "seconds\n"; 

die(); 

gibt so etwas wie

---------------------------------- 
10000000 repetitions... 
---------------------------------- 

substr() took 2.0285921096802seconds 
array access took 1.7474739551544seconds 
+2

Dies sollte ein Kommentar zu Gordons Antwort sein. – Goose

+1

Kann dies bestätigen. Je länger die Saite ist, desto größer ist der Leistungsunterschied. In meinem Test mit 10 Zeichen ist substr etwa 20% langsamer – Philipp

+0

Nicht überraschend, da substr() hat den Overhead eines Funktionsaufrufs und der andere ist "C wie" direkte String-Manipulation. BTW Ich lief diesen Code auf PHP 7.1-Dev mit den Ergebnissen: substr() dauerte 7.090255022049seconds \ Array-Zugriff dauerte 2.3145787715912seconds – RyanNerd

15

In den aufstrebenden PHP 7.1 Sie werden in der Lage sein, dies zu tun (Accepted rfc for negative string offsets):

<?php 
$silly = 'Mary had a little lamb'; 
echo $silly[-20]; 
echo $silly{-6}; 
echo $silly[-3]; 
echo $silly[-15]; 
echo $silly[-13]; 
echo $silly[-1]; 
echo $silly[-4]; 
echo $silly{-10}; 
echo $silly[-4]; 
echo $silly[-8]; 
echo $silly{3}; 
die(); 

Ich lasse Sie die Ausgabe erraten.

auch, habe ich dies zu xenonite's Performance Code mit diesen Ergebnissen:

substr() nahm 7,0334868431091 Sekunden

Array-Zugriff 2,3111131191254 Sekunden nahm

Direktbandzugangs 1 nahm.7971360683441seconds

+0

Absichtlich falsch geschrieben ... – RyanNerd

+0

Awesome Feature! – Slowaways

+0

Danke für das Setzen von Benchmarks! Wenn jemand an C# -Benchmarks interessiert ist, um das gleiche zu tun, [diese Seite] (http: //cc.davelozinski.com/c-sharp/c-schnellste-Weg-zu-prüfen-Last-Zeichen-of-a-String) ist eine gute Lese. Direkter Zugriff auf das letzte gewonnene Zeichen. – WorkRelated

1

Sie letzte Zeichen php viele Möglichkeiten, wie substr() und mb_substr() mit finden.

Wenn Sie mit Multibyte-Zeichencodierungen wie UTF-8 verwenden mb_substr statt substr

Hier i Ihnen beiden Beispiele zeigen:

<?php 
    echo substr("testers", -1); 
    echo mb_substr("testers", -1); 
?> 

LIVE DEMO

1

Eine Zeichenfolge in verschiedenen Sprachen einschließlich Cis und PHP wird auch als eine Reihe von Zeichen betrachtet.

, dass in der Theorie wissen, Array-Operationen als String diejenigen sein, schneller sollten Sie tun könnten,

$foo = "bar"; 


$lastChar = strlen($foo) -1; 
echo $foo[$lastChar]; 

$firstChar = 0; 
echo $foo[$firstChar]; 

jedoch Standard-Array-Funktionen wie

count(); 

wird an einer Schnur nicht.

0

Siemano, erhält nur PHP-Dateien aus ausgewähltem Verzeichnis:

$dir = '/home/zetdoa/ftp/domeny/MY_DOMAIN/projekty/project'; 
$files = scandir($dir, 1); 


foreach($files as $file){ 
    $n = substr($file, -3); 
    if($n == 'php'){ 
    echo $file.'<br />'; 
    } 
} 
Verwandte Themen