วิธีการรับอักขระสุดท้ายของสตริงใน PHP?


476

ฉันต้องได้รับอักขระตัวสุดท้ายของสตริง สมมติว่าฉันมี "ผู้ทดสอบ" เป็นสตริงอินพุตและฉันต้องการผลลัพธ์ที่จะเป็น "s" ฉันจะทำอย่างนั้นใน PHP ได้อย่างไร


คุณอาจพบว่ามีs($str)->end()ประโยชน์ดังที่พบในไลบรารีแบบสแตนด์อโลนนี้
caw

คำตอบ:


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

หรือสำหรับสตริงหลายไบต์:

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

114
หากคุณใช้การเข้ารหัสอักขระหลายไบต์เช่น UTF-8 ให้ใช้mb_substr( php.net/mb_substr ) แทน
ต้นกระเจี๊ยบ

9
มากสำหรับสตริงย่อยของฉัน ($ string, strlen ($ string) -1, 1); ดูเหมือนว่าฉันใช้เวลานานมาก!
jeffkee

4
คุณต้องการฟังก์ชั่นสตริงหลายไบต์เท่านั้นหากสตริงนั้นได้รับการประเมินว่าเป็นสตริงไบนารี Aka เมื่อ php ไม่รู้การเข้ารหัส มิฉะนั้นฟังก์ชั่นสตริงทั่วไปที่ไม่ใช่มัลติไบต์จะทำงานได้ดี
เรย์ฟอสส์


70

หรือโดยการเข้าถึงสตริงโดยตรง :

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

โปรดทราบว่าวิธีนี้ใช้ไม่ได้กับสตริงหลายไบต์ หากคุณต้องการทำงานกับสตริงหลายไบต์ให้พิจารณาใช้mb_*ตระกูลสตริงของฟังก์ชั่น

ในฐานะที่เป็นของดัชนีตัวเลขเชิงลบ PHP 7.1.0 ได้รับการสนับสนุนเช่นเดียวกับ $string[-1];


2
ฉันชอบคำตอบสไตล์ C นี้ฉันสงสัยว่าทำไมสิ่งนี้ถึงมี upvotes ไม่กี่ตัวเท่านั้น
Valentin Mercier

16
@ValentinMercier: เพราะนี่เป็นคำถาม PHP, ไม่ได้ซี
มาร์ติน Thoma

1
ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่ดีกว่าเพราะจะช่วยให้คุณสามารถปรับเปลี่ยนอักขระได้ในขณะที่โซลูชัน substr ที่ให้ไว้ข้างต้นไม่ได้
cazort

โปรดทราบว่าสิ่งนี้จะส่งการแจ้งเตือนหากสตริงว่างเปล่า
Scott Buchanan

40

จาก 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 วินาที


ขอบคุณสำหรับการโพสต์มาตรฐาน! หากใครสนใจมาตรฐาน C # สำหรับการทำสิ่งเดียวกันหน้านี้เป็นการอ่านที่ดี เข้าถึงตัวละครตัวสุดท้ายโดยตรง

คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับความแตกต่างระหว่าง [] และ {} ในบริบทนี้ได้หรือไม่
Taufik Nur Rahmanda

2
@TaufikNurRahmanda โดยทางเทคนิคแล้วไม่มีความแตกต่างระหว่าง [] และ {} นักพัฒนา PHP ให้ตัวเลือกในการใช้อย่างใดอย่างหนึ่ง ดูรายละเอียดเพิ่มเติมได้ที่: php.net/manual/en/migration71.new-features.php
RyanNerd

การเข้าถึงอาร์เรย์คืออะไรและการเข้าถึงสตริงโดยตรงคืออะไร @RyanNerd afaik นั่นคือ 2 สิ่งเดียวกันใช่ไหม?
กะรัต

1
$ string {1} จะเลิกใช้ใน PHP 7.4 (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
Tony Vlcek

17

ฉันไม่สามารถแสดงความคิดเห็นได้ แต่เกี่ยวกับคำตอบของ FastTrack โปรดจำไว้ว่าการสิ้นสุดบรรทัดอาจเป็นอักขระตัวเดียว ฉันจะแนะนำ

substr(trim($string), -1)

แก้ไข: รหัสของฉันด้านล่างได้รับการแก้ไขโดยใครบางคนทำให้ไม่ได้ทำสิ่งที่ฉันระบุ ฉันกู้คืนรหัสดั้งเดิมของฉันและเปลี่ยนข้อความเพื่อให้ชัดเจนยิ่งขึ้น

trim(หรือrtrim) จะลบช่องว่างทั้งหมดดังนั้นหากคุณต้องการตรวจสอบช่องว่างแท็บหรือช่องว่างอื่น ๆ ให้แทนที่ด้วยตัวเองในตอนท้ายบรรทัดต่าง ๆ ก่อน:

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

12

ตั้งแต่ 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)

การใช้ออฟเซ็ตเชิงลบเป็นเทคนิคที่กล่าวถึงเมื่อหลายปีก่อนโดย RyanNerd โปรดโพสต์คำตอบเมื่อคุณมีข้อมูลเชิงลึกที่ไม่ซ้ำใครและมีค่าที่จะแบ่งปัน
mickmackusa

@mickmackusa ทำไมคุณถึงเขียนถึงฉันเท่านั้นและเพิกเฉย substr ที่หลากหลาย ()
nektobit

ไม่มีอะไรเป็นส่วนตัวฉันเพิ่งเห็นคำตอบสั้น ๆ และซ้ำซ้อนของคุณและตัดสินใจที่จะเป่านกหวีด อย่าลังเลที่จะแจ้งคำตอบอื่น ๆ หากคุณรู้สึกว่าพวกเขาไม่มีคุณค่า โปรดจำไว้ว่าคำตอบสองข้อสามารถแนะนำเทคนิคเดียวกัน แต่ทั้งคู่มีค่าเป็นรายบุคคลเพราะสิ่งที่อธิบายไว้ นี่คือสถานที่แห่งการศึกษาและการเสริมพลัง - การเพิ่มความเข้าใจที่ไม่เหมือนใครให้กับโซลูชันที่นำเสนอก่อนหน้านี้อาจเป็นประโยชน์สำหรับนักวิจัย
mickmackusa

ตัวอย่างเช่นคำตอบของฉันนี้ถูกโพสต์หนึ่งเดือนหลังจากเทคนิคเดียวกันถูกโพสต์ ฉันกำลังจะเขียนความคิดเห็นภายใต้คำตอบก่อนหน้านี้ แต่เมื่อฉันพิมพ์ข้อมูลทั้งหมดที่ฉันต้องการเสนอมันชัดเจนเกินกว่าจะแสดงความคิดเห็นได้อย่างสมเหตุสมผล ฉันโพสต์คำตอบใหม่และเพิ่มข้อมูลเชิงลึกฟรีมากมายและข้อมูลพื้นฐานเกี่ยวกับเทคนิคและรวมถึงเกณฑ์มาตรฐาน นี่คือวิธีการแก้ปัญหาที่ไม่ซ้ำกันสามารถเป็นประโยชน์ต่อนักวิจัย
mickmackusa

5

ฉันแนะนำให้ไปแก้ปัญหาของ 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

2
นี่ควรเป็นความเห็นต่อคำตอบของกอร์ดอน
Goose

1
สามารถยืนยันสิ่งนี้ ยิ่งสตริงของคุณยาวขึ้นเท่าไหร่ก็ยิ่งมีความแตกต่างด้านประสิทธิภาพมากขึ้นเท่านั้น ในการทดสอบของฉันกับสตริงย่อย 10 ตัวอักษรช้าลงประมาณ 20%
ฟิลิปป์

ไม่น่าแปลกใจที่ substr () มีค่าใช้จ่ายในการเรียกใช้ฟังก์ชันและอีกรายการหนึ่งคือ "C like" การจัดการสตริงโดยตรง BTW ฉันรันโค้ดนี้บน PHP 7.1-dev พร้อมกับผลลัพธ์: substr () เอา 7.090255022049seconds \ array access เอา 2.3145787715912 วินาที
RyanNerd

4

โปรดจำไว้ว่าถ้าคุณมีสตริงที่อ่านเป็นบรรทัดจากไฟล์ข้อความโดยใช้fgets()ฟังก์ชั่นคุณต้องใช้substr($string, -3, 1)เพื่อให้ได้ตัวอักษรจริงไม่ใช่ส่วนหนึ่งของ CRLF (Carriage Return Line Feed)

ฉันไม่คิดว่าคนที่ถามคำถามต้องการสิ่งนี้ แต่สำหรับฉันฉันมีปัญหาในการรับตัวอักษรตัวสุดท้ายจากสตริงจากไฟล์ข้อความดังนั้นฉันจึงมั่นใจว่าคนอื่นจะเจอปัญหาที่คล้ายกัน


2

คุณสามารถค้นหาตัวอักษรตัวสุดท้ายใช้ PHP หลายวิธีเช่นการsubstr ()และmb_substr ()

หากคุณใช้การเข้ารหัสอักขระหลายไบต์เช่น UTF-8 ให้ใช้mb_substrแทนsubstr

ที่นี่ฉันสามารถแสดงตัวอย่างทั้งสอง:

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

สาธิตสด


1

สตริงในภาษาที่แตกต่างกันรวมถึง C sharp และ PHP ยังถือว่าเป็นอาร์เรย์ของอักขระ

รู้ว่าในการดำเนินการอาร์เรย์ทฤษฎีควรเร็วกว่าสตริงที่คุณสามารถทำได้

$foo = "bar";


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

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

อย่างไรก็ตามฟังก์ชั่นอาร์เรย์มาตรฐานเช่น

count();

จะไม่ทำงานกับสตริง


-3

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 />';
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.