Jeśli używasz kodowania znaków wielobajtowych, takich jak UTF-8, zamiast tego użyj mb_substr( php.net/mb_substr ).
Gumbo
9
tyle dla mojego substr ($ string, strlen ($ string) -1, 1); Wygląda na to, że wybrałem DŁUGĄ drogę!
jeffkee
4
Potrzebujesz ciągów wielobajtowych, tylko jeśli ciąg jest oceniany jako ciąg binarny. Aka, gdy php nie zna kodowania. W przeciwnym razie typowe nie łańcuchowe funkcje łańcuchowe będą działać dobrze.
Dziękujemy za opublikowanie testów porównawczych! Jeśli ktoś jest zainteresowany testami porównawczymi C # za zrobienie tego samego, ta strona jest dobra. Wygrał bezpośredni dostęp do ostatniej postaci.
czy możesz wyjaśnić więcej na temat różnic między [] a {} w tym kontekście?
Taufik Nur Rahmanda
2
@TaufikNurRahmanda Technicznie nie ma różnicy między [] a {}. Programiści PHP dali opcję użycia jednego z nich. Aby uzyskać więcej informacji, zobacz: php.net/manual/en/migration71.new-features.php
RyanNerd
co to jest dostęp do tablicy i co to jest bezpośredni dostęp do ciągu? @RyanNerd afaik to 2 takie same rzeczy, nie?
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:
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:
Stosowanie przesunięć ujemnych było techniką wspomnianą wiele lat wcześniej przez RyanNerd. Opublikuj odpowiedź tylko wtedy, gdy masz unikalne i cenne informacje do udostępnienia.
mickmackusa
@mickmackusa Dlaczego napisałeś to tylko dla mnie i zignorowałeś wiele odmian substr ()?
nektobit
Nic osobistego, właśnie zobaczyłem twoją bardzo krótką i zbędną odpowiedź i postanowiłem dmuchnąć w gwizdek. Jeśli masz wrażenie, że nie wnoszą one żadnej wartości, zachęcamy do ujawnienia innych odpowiedzi. Pamiętaj, że dwie odpowiedzi mogą sugerować tę samą technikę, ale każda z nich może być indywidualnie cenna z powodu tego, co zostało wyjaśnione. Jest to miejsce edukacji i wzmocnienia - dodawanie unikalnych informacji do wcześniej oferowanych rozwiązań może być bardzo cenne dla badaczy.
mickmackusa
Na przykład moja odpowiedź została opublikowana miesiąc po opublikowaniu tej samej techniki. Zamierzałem napisać komentarz pod wcześniejszą odpowiedzią, ale kiedy wpisałem wszystkie informacje, które chciałem zaoferować, było to oczywiście zbyt wiele, aby rozsądnie skomentować. Opublikowałem nową odpowiedź i dodałem wiele dodatkowych spostrzeżeń i podstawowych informacji dotyczących techniki oraz zawierałem punkt odniesienia. W ten sposób nie unikalne rozwiązanie może być cenne dla naukowców.
mickmackusa
5
Radzę wybrać rozwiązanie Gordona, ponieważ jest ono bardziej wydajne niż substr ():
----------------------------------10000000 repetitions...----------------------------------
substr() took 2.0285921096802seconds
array access took 1.7474739551544seconds
Potwierdzam to. Im dłuższy ciąg, tym większa różnica w wydajności. W moim teście z 10 znakami substr jest około 20% wolniejszy
Philipp
Nic dziwnego, ponieważ substr () ma narzut wywołania funkcji, a drugą jest bezpośrednia manipulacja ciągiem znaków podobna do „C”. BTW Uruchomiłem ten kod na PHP 7.1-dev z wynikami: substr () zajął 7.090255022049seconds \ dostęp do tablicy zajął 2.3145787715912seconds
RyanNerd
4
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.
s($str)->end()
Pomocne mogą być informacje zawarte w tej niezależnej bibliotece .Odpowiedzi:
Lub w przypadku ciągów wielobajtowych:
źródło
mb_substr
( php.net/mb_substr ).źródło
Lub przez bezpośredni dostęp do ciągu :
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];
źródło
Z PHP 7.1 możesz to zrobić ( Akceptowane rfc dla ujemnych przesunięć łańcucha ):
Pozwolę ci zgadnąć wynik.
Dodałem również to do kodu wydajności ksenonitu z następującymi wynikami:
źródło
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
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
(lubrtrim
) 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:źródło
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:
PRÓBNY
Na prośbę @mickmackusa uzupełniam moją odpowiedź możliwymi sposobami zastosowania:
źródło
Radzę wybrać rozwiązanie Gordona, ponieważ jest ono bardziej wydajne niż substr ():
wypisuje coś podobnego
źródło
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.
źródło
Ostatni znak można znaleźć za pomocą php na wiele sposobów, takich jak substr () i mb_substr () .
Tutaj mogę pokazać oba przykłady:
DEMO NA ŻYWO
źródło
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ć,
Jednak standardowe funkcje tablicy, takie jak
nie będzie działać na łańcuchu.
źródło
Siemano, pobierz tylko pliki php z wybranego katalogu:
źródło