ฉันต้องได้รับอักขระตัวสุดท้ายของสตริง สมมติว่าฉันมี "ผู้ทดสอบ" เป็นสตริงอินพุตและฉันต้องการผลลัพธ์ที่จะเป็น "s" ฉันจะทำอย่างนั้นใน PHP ได้อย่างไร
ฉันต้องได้รับอักขระตัวสุดท้ายของสตริง สมมติว่าฉันมี "ผู้ทดสอบ" เป็นสตริงอินพุตและฉันต้องการผลลัพธ์ที่จะเป็น "s" ฉันจะทำอย่างนั้นใน PHP ได้อย่างไร
คำตอบ:
substr("testers", -1); // returns "s"
หรือสำหรับสตริงหลายไบต์:
substr("multibyte string…", -1); // returns "…"
mb_substr
( php.net/mb_substr ) แทน
substr($string, -1)
หรือโดยการเข้าถึงสตริงโดยตรง :
$string[strlen($string)-1];
โปรดทราบว่าวิธีนี้ใช้ไม่ได้กับสตริงหลายไบต์ หากคุณต้องการทำงานกับสตริงหลายไบต์ให้พิจารณาใช้mb_*
ตระกูลสตริงของฟังก์ชั่น
ในฐานะที่เป็นของดัชนีตัวเลขเชิงลบ PHP 7.1.0 ได้รับการสนับสนุนเช่นเดียวกับ $string[-1];
จาก PHP 7.1 คุณสามารถทำได้ ( rfc ที่ยอมรับสำหรับการชดเชยสตริงเชิงลบ ):
<?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();
ฉันจะให้คุณเดาผลลัพธ์
นอกจากนี้ฉันได้เพิ่มสิ่งนี้ลงในโค้ดประสิทธิภาพของ xenoniteพร้อมผลลัพธ์เหล่านี้:
substr () ใช้เวลา 7.0334868431091 วินาที
การเข้าถึงอาร์เรย์ใช้เวลา 2.3111131191254 วินาที
การเข้าถึงสตริงโดยตรง (ออฟเซ็ตสตริงเชิงลบ) ใช้เวลา 1.7971360683441 วินาที
ฉันไม่สามารถแสดงความคิดเห็นได้ แต่เกี่ยวกับคำตอบของ FastTrack โปรดจำไว้ว่าการสิ้นสุดบรรทัดอาจเป็นอักขระตัวเดียว ฉันจะแนะนำ
substr(trim($string), -1)
แก้ไข: รหัสของฉันด้านล่างได้รับการแก้ไขโดยใครบางคนทำให้ไม่ได้ทำสิ่งที่ฉันระบุ ฉันกู้คืนรหัสดั้งเดิมของฉันและเปลี่ยนข้อความเพื่อให้ชัดเจนยิ่งขึ้น
trim
(หรือrtrim
) จะลบช่องว่างทั้งหมดดังนั้นหากคุณต้องการตรวจสอบช่องว่างแท็บหรือช่องว่างอื่น ๆ ให้แทนที่ด้วยตัวเองในตอนท้ายบรรทัดต่าง ๆ ก่อน:
$order = array("\r\n", "\n", "\r");
$string = str_replace($order, '', $string);
$lastchar = substr($string, -1);
ตั้งแต่ PHP 7.1.0 สนับสนุนการออฟเซ็ตสตริงเชิงลบเช่นกัน ดังนั้นหากคุณตามเวลาคุณสามารถเข้าถึงตัวอักษรสุดท้ายในสตริงดังนี้
$str[-1]
ตามคำร้องขอของ @mickmackusa ฉันเสริมคำตอบด้วยวิธีการสมัครที่เป็นไปได้:
<?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)
ฉันแนะนำให้ไปแก้ปัญหาของ Gordon เพราะมันมีประสิทธิภาพมากกว่า 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();
แสดงผลเหมือน
----------------------------------
10000000 repetitions...
----------------------------------
substr() took 2.0285921096802seconds
array access took 1.7474739551544seconds
โปรดจำไว้ว่าถ้าคุณมีสตริงที่อ่านเป็นบรรทัดจากไฟล์ข้อความโดยใช้fgets()
ฟังก์ชั่นคุณต้องใช้substr($string, -3, 1)
เพื่อให้ได้ตัวอักษรจริงไม่ใช่ส่วนหนึ่งของ CRLF (Carriage Return Line Feed)
ฉันไม่คิดว่าคนที่ถามคำถามต้องการสิ่งนี้ แต่สำหรับฉันฉันมีปัญหาในการรับตัวอักษรตัวสุดท้ายจากสตริงจากไฟล์ข้อความดังนั้นฉันจึงมั่นใจว่าคนอื่นจะเจอปัญหาที่คล้ายกัน
สตริงในภาษาที่แตกต่างกันรวมถึง C sharp และ PHP ยังถือว่าเป็นอาร์เรย์ของอักขระ
รู้ว่าในการดำเนินการอาร์เรย์ทฤษฎีควรเร็วกว่าสตริงที่คุณสามารถทำได้
$foo = "bar";
$lastChar = strlen($foo) -1;
echo $foo[$lastChar];
$firstChar = 0;
echo $foo[$firstChar];
อย่างไรก็ตามฟังก์ชั่นอาร์เรย์มาตรฐานเช่น
count();
จะไม่ทำงานกับสตริง
Siemano รับเฉพาะไฟล์ php จากไดเรกทอรีที่เลือก:
$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()
ประโยชน์ดังที่พบในไลบรารีแบบสแตนด์อโลนนี้