2010-04-21 41 views
344

Tôi cần lấy ký tự cuối cùng của chuỗi. Giả sử tôi có "người kiểm tra" làm chuỗi đầu vào và tôi muốn kết quả là "s". làm thế nào tôi có thể làm điều đó trong PHP?làm thế nào để có được char cuối cùng của một chuỗi trong PHP?

+0

Xem câu trả lời của tôi dưới đây để biết tính năng này trong 7.1 của PHP. – RyanNerd

+0

Bạn có thể tìm thấy ['s ($ str) -> end()'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L192) hữu ích, như được tìm thấy trong [thư viện độc lập này] (https://github.com/delight-im/PHP-Str). – caw

Trả lời

714
substr("testers", -1); // returns "s" 
+89

Nếu bạn đang sử dụng mã hóa ký tự nhiều byte như UTF-8, hãy sử dụng' mb_substr' (http://php.net/ mb_substr) để thay thế. – Gumbo

+5

rất nhiều cho chất nền của tôi ($ string, strlen ($ string) -1, 1) ;. Có vẻ như tôi đã đi theo con đường LONG! – jeffkee

+3

Bạn chỉ cần các hàm chuỗi nhiều byte nếu chuỗi được đánh giá là chuỗi nhị phân. Aka, khi php không biết mã hóa. Nếu không, các hàm chuỗi không đa byte điển hình sẽ hoạt động tốt. –

55
substr($string, -1) 
+2

Không có hàm PHP nào gọi là "chuỗi con", bạn sẽ gặp lỗi trừ khi bạn đã thực hiện chức năng chuỗi con của riêng mình. Nên là "chất nền". –

+21

ahh bạn làm hỏng toàn bộ trò đùa. +8 bỏ phiếu cho câu trả lời sai trông thật tuyệt vời :) –

+2

duh…, nghĩa là 'substr' của khóa học – knittl

52

Hoặc bởi direct string access:

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

Lưu ý rằng điều này không làm việc cho chuỗi multibyte. Nếu bạn cần phải làm việc với chuỗi multibyte, xem xét sử dụng mb_* string family of functions.

+2

Tôi thích câu trả lời theo phong cách C này, tôi tự hỏi tại sao điều này chỉ có một vài upvotes này. –

+13

@ValentinMercier: Vì đây là một câu hỏi PHP, không phải C. –

+2

@ValentinMercier ... và _only_ C lập trình viên có một _contest_ cho mã khó hiểu! http://ioccc.org/ – Slashback

3

Hãy nhớ rằng, nếu bạn có một chuỗi được đọc như một dòng từ một tập tin văn bản bằng cách sử dụng fgets() chức năng, bạn cần phải sử dụng substr($string, -3, 1) để bạn có được những thực tế và không phải là một phần của CRLF (Nguồn cấp dòng trả về vận chuyển).

Tôi không nghĩ rằng người hỏi câu hỏi này cần thiết, nhưng đối với tôi, tôi gặp khó khăn khi lấy ký tự cuối cùng từ một chuỗi từ tệp văn bản, vì vậy tôi chắc chắn những người khác sẽ gặp phải vấn đề tương tự.

14

Tôi không thể để lại nhận xét, nhưng liên quan đến câu trả lời của FastTrack, hãy nhớ rằng dòng kết thúc có thể chỉ là ký tự đơn. Tôi sẽ đề nghị

substr(trim($string), -1) 

EDIT:Mã của tôi dưới đây đã được chỉnh sửa bởi một ai đó, làm cho nó không làm những gì tôi chỉ định. Tôi đã khôi phục mã gốc của mình và thay đổi từ ngữ để làm cho nó rõ ràng hơn.

trim (hoặc rtrim) sẽ loại bỏ tất cả khoảng trắng, vì vậy nếu bạn cần phải kiểm tra cho một không gian, tab hoặc khoảng trắng khác, bằng tay thay thế kết thúc dòng khác nhau đầu tiên:

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

tôi 'd tư vấn để đi cho giải pháp Gordon vì nó là hơn performant hơn 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(); 

ra một cái gì đó giống như

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

substr() took 2.0285921096802seconds 
array access took 1.7474739551544seconds 
+2

Điều này sẽ là một bình luận về câu trả lời của Gordon. – Goose

+1

Có thể xác nhận điều này. Chuỗi của bạn càng dài thì hiệu số càng lớn. Trong thử nghiệm của tôi với 10 ký tự nền là khoảng 20% ​​chậm hơn – Philipp

+0

Không ngạc nhiên khi substr() có chi phí của một cuộc gọi chức năng và khác là "C như" thao tác chuỗi trực tiếp. BTW Tôi chạy mã này trên PHP 7.1-dev với kết quả: substr() mất 7.090255022049seconds \ truy cập mảng mất 2.3145787715912seconds – RyanNerd

15

Trong lên và sắp tới PHP 7.1, bạn sẽ có thể làm điều này (Accepted rfc for negative string offsets):

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

Tôi sẽ cho bạn đoán sản lượng.

Ngoài ra, tôi bổ sung này để xenonite's đang thực hiện với những kết quả này:

substr() mất 7.0334868431091seconds

truy cập mảng mất 2.3111131191254seconds

truy cập chuỗi trực tiếp mất 1.7971360683441seconds

+0

Cố ý sai chính tả ... – RyanNerd

+0

Tính năng tuyệt vời! – Slowaways

+0

Cảm ơn bạn đã đăng điểm chuẩn! Nếu bất cứ ai quan tâm đến C# điểm chuẩn để làm điều tương tự, [trang này] (http: //cc.davelozinski.com/c-sharp/c-nhanh nhất-way-to-check-last-ký tự-of-a-string) là một đọc tốt. Trực tiếp truy cập vào nhân vật cuối cùng đã thắng. – WorkRelated

1

Bạn có thể tìm ký tự cuối bằng cách sử dụng nhiều cách php như substr()mb_substr().

Nếu bạn đang sử dụng bảng mã ký tự nhiều byte như UTF-8, sử dụng mb_substr thay vì substr

Ở đây tôi có thể cho bạn thấy cả hai ví dụ:

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

LIVE DEMO

1

Một chuỗi bằng các ngôn ngữ khác nhau bao gồm C sắc nét và PHP cũng được coi là một mảng các ký tự.

Biết rằng về mặt lý thuyết hoạt động mảng nên nhanh hơn so với những chuỗi bạn có thể làm,

$foo = "bar"; 


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

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

Tuy nhiên, chức năng tiêu chuẩn như mảng

count(); 

sẽ không hoạt động trên một chuỗi.

0

Siemano, được các tập tin chỉ php từ thư mục được chọn:

$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 />'; 
    } 
} 
Các vấn đề liên quan