Bagaimana cara mendapatkan karakter terakhir dari string di PHP?

476

Saya perlu mendapatkan karakter terakhir dari sebuah string. Katakanlah saya memiliki "penguji" sebagai string input dan saya ingin hasilnya menjadi "s". bagaimana saya bisa melakukannya di PHP?

streetparade
sumber
Anda mungkin menemukan s($str)->end()bermanfaat, seperti yang ditemukan di perpustakaan mandiri ini .
gak

Jawaban:

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

Atau, untuk string multibytes:

substr("multibyte string…", -1); // returns "…"
Adams kaya
sumber
114
Jika Anda menggunakan penyandian karakter multibyte seperti UTF-8, gunakan mb_substr( php.net/mb_substr ) sebagai gantinya.
Gumbo
9
begitu banyak untuk substr ($ string, strlen ($ string) -1, 1) ;. Sepertinya saya sudah mengambil jalan PANJANG!
jeffkee
4
Anda hanya perlu fungsi string multibyte jika string dievaluasi sebagai string biner. Aka, ketika php tidak tahu encoding. Kalau tidak, fungsi string non multibyte khas akan bekerja dengan baik.
Ray Foss
76
substr($string, -1) 
rajutan
sumber
70

Atau dengan akses string langsung :

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

Perhatikan bahwa ini tidak berfungsi untuk string multibyte. Jika Anda perlu bekerja dengan string multibyte, pertimbangkan untuk menggunakan mb_*rangkaian fungsi string.

Pada PHP 7.1.0 indeks numerik negatif juga didukung, misalnya adil $string[-1];

Gordon
sumber
2
Saya suka jawaban gaya C ini, saya bertanya-tanya mengapa ini hanya mendapat beberapa upvotes ini.
Valentin Mercier
16
@ValentinMercier: Karena ini adalah pertanyaan PHP, bukan C.
Martin Thoma
1
Saya pikir ini adalah solusi yang lebih baik karena memungkinkan Anda untuk memodifikasi karakter, sedangkan solusi substr yang diberikan di atas tidak.
cazort
Perhatikan bahwa ini akan memberikan pemberitahuan jika string kosong.
Scott Buchanan
40

Dari PHP 7.1 Anda dapat melakukan ini ( rfc yang diterima untuk offset string negatif ):

<?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();

Saya akan membiarkan Anda menebak hasilnya.

Juga, saya menambahkan ini ke kode kinerja xenonite dengan hasil ini:

substr () mengambil 7.0334868431091seconds

akses array mengambil 2.3111131191254seconds

Akses string langsung (offset string negatif) mengambil 1,7971360683441 detik

RyanNerd
sumber
Terima kasih telah mengirim tolok ukur! Jika ada yang tertarik dengan tolok ukur C # untuk melakukan hal yang sama, halaman ini adalah bacaan yang bagus. Langsung mengakses karakter terakhir dimenangkan.
dapatkah Anda menjelaskan lebih lanjut tentang perbedaan antara [] dan {} dalam konteks ini?
Taufik Nur Rahmanda
2
@TaufikNurRahmanda Secara teknis tidak ada perbedaan antara [] dan {}. Pengembang PHP memberikan opsi untuk menggunakan keduanya. Untuk perincian lebih lanjut, lihat: php.net/manual/en/migration71.new-features.php
RyanNerd
apa itu akses array dan apa itu akses string langsung? @RyanNerd afaik itu adalah 2 hal yang sama, bukan?
CT.
1
$ string {1} akan ditinggalkan dalam PHP 7.4 (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
Tony Vlcek
17

Saya tidak dapat meninggalkan komentar, tetapi sehubungan dengan jawaban FastTrack, juga ingat bahwa akhir baris mungkin hanya satu karakter. saya akan menyarankan

substr(trim($string), -1)

EDIT: Kode saya di bawah ini diedit oleh seseorang, membuatnya tidak melakukan apa yang saya sebutkan. Saya telah memulihkan kode asli saya dan mengubah kata-katanya agar lebih jelas.

trim(atau rtrim) akan menghapus semua spasi putih, jadi jika Anda perlu memeriksa spasi, tab, atau spasi putih lainnya, ganti secara manual berbagai ujung baris terlebih dahulu:

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

Pada PHP 7.1.0, offset string negatif juga didukung. Jadi, jika Anda mengikuti perkembangan zaman, Anda dapat mengakses karakter terakhir dalam string seperti ini:

$str[-1]

DEMO

Atas permintaan @mickmackusa, saya melengkapi jawaban saya dengan cara aplikasi yang memungkinkan:

<?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)
nektobit
sumber
Menggunakan offset negatif adalah teknik yang disebutkan bertahun-tahun sebelumnya oleh RyanNerd. Silakan kirim jawaban hanya ketika Anda memiliki wawasan yang unik dan berharga untuk dibagikan.
mickmackusa
@mickmackusa Mengapa Anda menulis hanya untuk saya dan mengabaikan beberapa variasi substr ()?
nektobit
Bukan masalah pribadi, saya hanya melihat jawaban Anda yang sangat pendek dan berlebihan dan memutuskan untuk meniup peluit saya. Jangan ragu untuk mengungkap jawaban lain jika Anda merasa tidak menambah nilai. Perlu diingat, dua jawaban dapat menyarankan teknik yang sama tetapi keduanya bernilai secara individual karena apa yang dijelaskan. Ini adalah tempat pendidikan dan pemberdayaan - menambahkan wawasan unik untuk solusi yang ditawarkan sebelumnya bisa sangat berharga bagi para peneliti.
mickmackusa
Sebagai contoh, jawaban saya ini diposting sebulan setelah teknik yang sama diposting. Saya akan menulis komentar di bawah jawaban sebelumnya, tetapi ketika saya mengetik semua informasi yang ingin saya tawarkan, itu jelas terlalu banyak untuk komentar yang masuk akal. Saya memposting jawaban baru dan menambahkan banyak wawasan gratis dan informasi latar belakang mengenai teknik ini dan termasuk tolok ukur. Ini adalah bagaimana solusi non-unik dapat bermanfaat bagi para peneliti.
mickmackusa
5

Saya akan menyarankan untuk mencari solusi Gordon karena lebih berkinerja daripada 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();

menghasilkan sesuatu seperti

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

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds
Xenonite
sumber
2
Ini harus menjadi komentar atas jawaban Gordon.
Goose
1
Dapat mengkonfirmasi ini. Semakin lama string Anda, semakin besar perbedaan kinerja. Dalam pengujian saya dengan 10 karakter substr adalah sekitar 20% lebih lambat
Philipp
Tidak mengherankan karena substr () memiliki overhead panggilan fungsi dan yang lainnya adalah "C like" manipulasi string langsung. BTW saya menjalankan kode ini di PHP 7.1-dev dengan hasil: substr () mengambil 7.090255022049seconds \ akses array mengambil 2.3145787715912seconds
RyanNerd
4

Ingat, jika Anda memiliki string yang dibaca sebagai baris dari file teks menggunakan fgets()fungsi, Anda harus menggunakan substr($string, -3, 1)sehingga Anda mendapatkan karakter aktual dan bukan bagian dari CRLF (Carriage Return Line Feed).

Saya tidak berpikir orang yang mengajukan pertanyaan memerlukan ini, tetapi bagi saya, saya mengalami kesulitan mendapatkan karakter terakhir dari string dari file teks jadi saya yakin orang lain akan menemukan masalah yang sama.

FastTrack
sumber
2

Anda dapat menemukan karakter terakhir menggunakan banyak cara php seperti substr () dan mb_substr () .

Jika Anda menggunakan pengkodean karakter multibyte seperti UTF-8, gunakan mb_substr alih-alih substr

Di sini saya dapat menunjukkan kepada Anda berdua contoh:

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

LIVE DEMO

Faisal
sumber
1

String dalam berbagai bahasa termasuk C sharp dan PHP juga dianggap sebagai array karakter.

Mengetahui bahwa dalam operasi array teori harus lebih cepat daripada yang bisa Anda lakukan,

$foo = "bar";


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

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

Namun, fungsi array standar suka

count();

tidak akan bekerja pada string.

Petar Atanasov
sumber
-3

Siemano, dapatkan hanya file php dari direktori yang dipilih:

$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 />';
  }
}
ZMORA PROSTO Z KRZOKA
sumber