Wie bekomme ich das letzte Zeichen eines Strings in PHP?


Antworten:


993
substr("testers", -1); // returns "s"

Oder für Multibyte-Zeichenfolgen:

substr("multibyte string…", -1); // returns "…"

114
Wenn Sie Multibyte-Zeichencodierungen wie UTF-8 verwenden, verwenden Sie stattdessen mb_substr( php.net/mb_substr ).
Gumbo

9
Soviel zu meinem Substrat ($ string, strlen ($ string) -1, 1);. Scheint, als hätte ich den langen Weg zurückgelegt!
Jeffrey

4
Sie benötigen Multibyte-String-Funktionen nur, wenn der String als Binärstring ausgewertet wird. Aka, wenn PHP die Kodierung nicht kennt. Andernfalls funktionieren die typischen Nicht-Multibyte-Zeichenfolgenfunktionen einwandfrei.
Ray Foss


70

Oder durch direkten Stringzugriff :

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

Beachten Sie, dass dies für Multibyte-Zeichenfolgen nicht funktioniert. Wenn Sie mit Multibyte-Zeichenfolgen arbeiten müssen, sollten Sie die Funktionsfamilie der mb_*Zeichenfolgen verwenden.

Ab PHP 7.1.0 werden auch negative numerische Indizes unterstützt, zB nur $string[-1];


2
Ich mag diese Antwort im C-Stil, ich frage mich, warum dies nur so wenige positive Stimmen hat.
Valentin Mercier

16
@ ValentinMercier: Weil dies eine PHP-Frage ist, nicht C.
Martin Thoma

1
Ich denke, dies ist eine bessere Lösung, da Sie damit den Charakter ändern können, während dies bei der oben angegebenen Substr-Lösung nicht der Fall ist.
Cazort

Beachten Sie, dass dies einen Hinweis auslöst, wenn die Zeichenfolge leer ist.
Scott Buchanan

40

Ab PHP 7.1 können Sie dies tun ( Akzeptiertes RFC für 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}; // <-- this will be deprecated in PHP 7.4
die();

Ich lasse Sie die Ausgabe erraten.

Außerdem habe ich dies mit den folgenden Ergebnissen zum Leistungscode von xenonite hinzugefügt :

substr () dauerte 7,0334868431091 Sekunden

Der Array-Zugriff dauerte 2,3111131191254 Sekunden

Der direkte String-Zugriff (negative String-Offsets) dauerte 1,7971360683441 Sekunden


Vielen Dank für die Veröffentlichung von Benchmarks! Wenn jemand an C # -Benchmarks interessiert ist, um dasselbe zu tun, ist diese Seite eine gute Lektüre. Der direkte Zugriff auf den letzten gewonnenen Charakter hat gewonnen.

Können Sie in diesem Zusammenhang mehr über den Unterschied zwischen [] und {} erklären?
Taufik Nur Rahmanda

2
@TaufikNurRahmanda Technisch gibt es keinen Unterschied zwischen [] und {}. Die PHP-Entwickler gaben die Option, entweder zu verwenden. Weitere Informationen finden Sie unter: php.net/manual/en/migration71.new-features.php
RyanNerd

Was ist Array-Zugriff und was ist direkter String-Zugriff? @ RyanNerd afaik das sind 2 gleiche Dinge, nein?
CT.

1
$ string {1} wird in PHP 7.4 (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
Tony Vlcek

17

Ich kann keine Kommentare hinterlassen, aber denke in Bezug auf die Antwort von FastTrack auch daran, dass das Zeilenende möglicherweise nur ein einzelnes Zeichen ist. ich würde vorschlagen

substr(trim($string), -1)

BEARBEITEN: Mein Code unten wurde von jemandem bearbeitet, sodass er nicht das tut, was ich angegeben habe. Ich habe meinen ursprünglichen Code wiederhergestellt und den Wortlaut geändert, um ihn klarer zu machen.

trim(oder rtrim) entfernt alle Leerzeichen. Wenn Sie also nach Leerzeichen, Tabulatoren oder anderen Leerzeichen suchen müssen, ersetzen Sie zuerst manuell die verschiedenen Zeilenenden:

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

12

Ab PHP 7.1.0 werden auch negative String-Offsets unterstützt. Wenn Sie also mit der Zeit Schritt halten, können Sie wie folgt auf das letzte Zeichen in der Zeichenfolge zugreifen:

$str[-1]

DEMO

Auf Wunsch eines @mickmackusa ergänze ich meine Antwort mit möglichen Bewerbungsmöglichkeiten:

<?php

$str='abcdef';
var_dump($str[-2]); // => string(1) "e"

$str[-3]='.';
var_dump($str);     // => string(6) "abc.ef"

var_dump(isset($str[-4]));  // => bool(true)

var_dump(isset($str[-10])); // => bool(false)

Die Verwendung negativer Offsets war eine Technik, die RyanNerd Jahre zuvor erwähnt hatte. Bitte posten Sie eine Antwort nur, wenn Sie einzigartige und wertvolle Erkenntnisse zum Teilen haben.
Mickmackusa

@mickmackusa Warum hast du es nur an mich geschrieben und die mehrfachen Variationen substr () ignoriert?
Nektobit

Nichts Persönliches, ich habe nur Ihre sehr kurze und überflüssige Antwort gesehen und beschlossen, meine Pfeife zu blasen. Fühlen Sie sich frei, die anderen Antworten zu pfeifen, wenn Sie der Meinung sind, dass sie keinen Mehrwert bieten. Denken Sie daran, zwei Antworten können dieselbe Technik vorschlagen, aber beide sind aufgrund der Erläuterungen individuell wertvoll. Dies ist ein Ort der Bildung und Ermächtigung - das Hinzufügen einzigartiger Erkenntnisse zu zuvor angebotenen Lösungen kann für Forscher sehr wertvoll sein.
Mickmackusa

Zum Beispiel wurde meine Antwort einen Monat nach der gleichen Technik veröffentlicht. Ich wollte unter der früheren Antwort einen Kommentar schreiben, aber als ich alle Informationen abtippte, die ich anbieten wollte, war es offensichtlich zu viel, um einen vernünftigen Kommentar abzugeben. Ich habe eine neue Antwort gepostet und viele kostenlose Einblicke und Hintergrundinformationen zur Technik hinzugefügt und einen Benchmark hinzugefügt. Auf diese Weise kann eine nicht eindeutige Lösung für Forscher wertvoll sein.
mickmackusa

5

Ich würde empfehlen, sich für Gordons Lösung zu entscheiden, da diese leistungsfähiger ist als substr ():

<?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 aus

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

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds

2
Dies sollte ein Kommentar zu Gordons Antwort sein.
Gans

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

Kein Wunder, da substr () den Overhead eines Funktionsaufrufs hat und der andere "C-like" direkte String-Manipulation ist. Übrigens habe ich diesen Code auf PHP 7.1-dev mit den Ergebnissen ausgeführt: substr () dauerte 7.090255022049seconds \ Array-Zugriff dauerte 2.3145787715912seconds
RyanNerd

4

Denken Sie daran, wenn Sie eine Zeichenfolge haben, die mit der fgets()Funktion als Zeile aus einer Textdatei gelesen wurde , müssen Sie diese verwenden, substr($string, -3, 1)damit Sie das tatsächliche Zeichen und nicht einen Teil der CRLF (Carriage Return Line Feed) erhalten.

Ich glaube nicht, dass die Person, die die Frage gestellt hat, dies benötigt, aber für mich hatte ich Probleme, das letzte Zeichen aus einer Zeichenfolge aus einer Textdatei zu erhalten, sodass ich sicher bin, dass andere auf ähnliche Probleme stoßen werden.


2

Sie können das letzte Zeichen mit PHP auf viele Arten finden, wie substr () und mb_substr () .

Wenn Sie Multibyte-Zeichencodierungen wie UTF-8 verwenden, verwenden Sie mb_substr anstelle von substr

Hier kann ich Ihnen beide 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 ebenfalls als Zeichenfolge betrachtet.

Zu wissen, dass Array-Operationen theoretisch schneller sein sollten als solche, die Sie ausführen können,

$foo = "bar";


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

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

Standard-Array-Funktionen wie

count();

funktioniert nicht an einer Zeichenfolge.


-3

Siemano, bekomme nur PHP-Dateien aus dem ausgewählten 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 />';
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.