Muszę uzyskać ostatni znak ciągu. Powiedzmy, że mam „testery” jako ciąg wejściowy i chcę, aby wynik był „s”. jak mogę to zrobić w PHP?
Muszę uzyskać ostatni znak ciągu. Powiedzmy, że mam „testery” jako ciąg wejściowy i chcę, aby wynik był „s”. jak mogę to zrobić w PHP?
Odpowiedzi:
substr("testers", -1); // returns "s"
Lub w przypadku ciągów wielobajtowych:
substr("multibyte string…", -1); // returns "…"
mb_substr
( php.net/mb_substr ).
Lub przez bezpośredni dostęp do ciągu :
$string[strlen($string)-1];
Zauważ, że to nie działa na łańcuchy wielobajtowe. Jeśli chcesz pracować z ciągiem wielobajtowym, rozważ użycie mb_*
rodziny ciągów funkcji.
Od PHP 7.1.0 obsługiwane są również ujemne wskaźniki liczbowe, np. Just $string[-1];
Z PHP 7.1 możesz to zrobić ( Akceptowane rfc dla ujemnych przesunięć łańcucha ):
<?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();
Pozwolę ci zgadnąć wynik.
Dodałem również to do kodu wydajności ksenonitu z następującymi wynikami:
substr () zajęło 7.0334868431091 sekund
dostęp do tablicy zajął 2.3111131191254 sekund
Bezpośredni dostęp do ciągu (ujemne przesunięcie ciągu) zajął 1,7971360683441 sekund
Nie mogę zostawiać komentarzy, ale w odniesieniu do odpowiedzi FastTrack pamiętaj również, że zakończenie linii może być tylko jednym znakiem. sugerowałbym
substr(trim($string), -1)
EDYCJA: Mój kod poniżej został edytowany przez kogoś, przez co nie robi tego, co wskazałem. Przywróciłem oryginalny kod i zmieniłem jego sformułowanie, aby było bardziej jasne.
trim
(lub rtrim
) usunie wszystkie białe znaki, więc jeśli musisz sprawdzić spację, tabulator lub inne białe znaki, najpierw ręcznie zamień różne zakończenia linii:
$order = array("\r\n", "\n", "\r");
$string = str_replace($order, '', $string);
$lastchar = substr($string, -1);
Począwszy od PHP 7.1.0, obsługiwane są również ujemne przesunięcia ciągów. Jeśli więc nadążasz za czasem, możesz uzyskać dostęp do ostatniego znaku w ciągu:
$str[-1]
Na prośbę @mickmackusa uzupełniam moją odpowiedź możliwymi sposobami zastosowania:
<?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)
Radzę wybrać rozwiązanie Gordona, ponieważ jest ono bardziej wydajne niż 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();
wypisuje coś podobnego
----------------------------------
10000000 repetitions...
----------------------------------
substr() took 2.0285921096802seconds
array access took 1.7474739551544seconds
Pamiętaj, że jeśli masz ciąg, który został odczytany jako wiersz z pliku tekstowego za pomocą fgets()
funkcji, musisz go użyć substr($string, -3, 1)
, aby uzyskać rzeczywisty znak, a nie część CRLF (Carriage Return Line Feed).
Nie sądzę, żeby osoba, która zadała pytanie, potrzebowała tego, ale dla mnie miałem problem z uzyskaniem tego ostatniego znaku z ciągu z pliku tekstowego, więc jestem pewien, że inni napotkają podobne problemy.
Ostatni znak można znaleźć za pomocą php na wiele sposobów, takich jak substr () i mb_substr () .
Jeśli używasz kodowania znaków wielobajtowych, takich jak UTF-8, użyj mb_substr zamiast substr
Tutaj mogę pokazać oba przykłady:
<?php
echo substr("testers", -1);
echo mb_substr("testers", -1);
?>
Ciąg znaków w różnych językach, w tym Cis i PHP, jest również uważany za tablicę znaków.
Wiedząc, że teoretycznie operacje tablicowe powinny być szybsze niż operacje łańcuchowe, które możesz wykonać,
$foo = "bar";
$lastChar = strlen($foo) -1;
echo $foo[$lastChar];
$firstChar = 0;
echo $foo[$firstChar];
Jednak standardowe funkcje tablicy, takie jak
count();
nie będzie działać na łańcuchu.
Siemano, pobierz tylko pliki php z wybranego katalogu:
$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 />';
}
}
s($str)->end()
Pomocne mogą być informacje zawarte w tej niezależnej bibliotece .