Làm thế nào để có được char cuối cùng của chuỗi trong PHP?


476

Tôi cần phải có được ký tự cuối cùng của một chuỗi. Nói rằng 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?


Bạn có thể thấy s($str)->end()hữu ích, như được tìm thấy trong thư viện độc lập này .
caw

Câu trả lời:


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

Hoặc, đối với chuỗi multibytes:

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

114
Nếu bạn đang sử dụng mã hóa ký tự đa nhân như UTF-8, thay vào đó , hãy sử dụng mb_substr( php.net/mb_substr ).
Gumbo

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

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


70

Hoặc bằng cách truy cập chuỗi trực tiếp :

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

Lưu ý rằng điều này không hoạt động cho chuỗi đa bào. Nếu bạn cần làm việc với chuỗi đa chuỗi, hãy xem xét sử dụng họ mb_*chuỗi hàm.

Kể từ phiên bản PHP 7.1.0 cũng được hỗ trợ, ví dụ: $string[-1];


2
Tôi thích câu trả lời kiểu C này, tôi tự hỏi tại sao điều này chỉ có vài upvote này.
Valentin Mercier

16
@ValentinMercier: Bởi vì đây là câu hỏi của PHP, không phải C.
Martin Thoma

1
Tôi nghĩ rằng đây là một giải pháp tốt hơn bởi vì nó cho phép bạn sửa đổi ký tự, trong khi giải pháp cơ bản được đưa ra ở trên thì không.
cazort

Lưu ý rằng điều này sẽ đưa ra một thông báo nếu chuỗi trống.
Scott Hội trưởng

40

Từ PHP 7.1, bạn có thể thực hiện việc này ( rfc được chấp nhận cho các chuỗi bù âm ):

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

Tôi sẽ cho bạn đoán đầu ra.

Ngoài ra, tôi đã thêm mã này vào mã hiệu suất của xenonite với các kết quả sau:

chất nền () mất 7.03348684 31091 giây

truy cập mảng mất 2.3111131191254 giây

Truy cập chuỗi trực tiếp (offset chuỗi âm) mất 1.7971360683441 giây


Cảm ơn đã đăng điểm chuẩn! Nếu bất cứ ai quan tâm đến điểm chuẩn C # để làm điều tương tự, trang này là một trang đọc tốt. Truy cập trực tiếp vào nhân vật cuối cùng đã thắng.

bạn có thể giải thích thêm về sự khác biệt giữa [] và {} trong ngữ cảnh này không?
Taufik Nur Rahmanda

2
@TaufikNurRahmanda Về mặt kỹ thuật không có sự khác biệt giữa [] và {}. Các nhà phát triển PHP đã cho tùy chọn sử dụng một trong hai. Để biết thêm chi tiết xem: php.net/manual/en/migration71.new-features.php
RyanNerd

truy cập mảng là gì và truy cập chuỗi trực tiếp là gì? @RyanNerd afaik đó là 2 điều giống nhau, phải không?
CT.

1
$ string {1} sẽ không được dùng nữa trong PHP 7.4 (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
Tony Vlcek

17

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, cũng nên nhớ rằng kết thúc dòng có thể chỉ là một ký tự. 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 người nào đó, khiến nó không làm được những gì tôi đã chỉ ra. 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ẽ xóa tất cả khoảng trắng, vì vậy nếu bạn cần kiểm tra khoảng trắng, tab hoặc khoảng trắng khác, trước tiên hãy thay thế các kết thúc dòng khác nhau:

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

12

Kể từ phiên bản PHP 7.1.0, phần bù chuỗi âm cũng được hỗ trợ. Vì vậy, nếu bạn theo kịp thời đại, bạn có thể truy cập ký tự cuối cùng trong chuỗi như thế này:

$str[-1]

BẢN GIỚI THIỆU

Theo yêu cầu của @mickmackusa, tôi bổ sung câu trả lời của mình bằng các cách áp dụng có thể:

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

Sử dụng bù đắp tiêu cực là một kỹ thuật được đề cập nhiều năm trước bởi RyanNerd. Vui lòng chỉ gửi câu trả lời khi bạn có những hiểu biết độc đáo và có giá trị để chia sẻ.
mickmackusa

@mickmackusa Tại sao bạn chỉ viết nó cho tôi và bỏ qua nhiều biến thể ()?
nektobit

Không có gì cá nhân, tôi chỉ thấy câu trả lời rất ngắn và thừa của bạn và quyết định thổi còi. Hãy thoải mái huýt sáo các câu trả lời khác nếu bạn cảm thấy chúng không có giá trị. Hãy nhớ rằng, hai câu trả lời có thể đề xuất cùng một kỹ thuật nhưng cả hai đều có giá trị riêng vì những gì được giải thích. Đây là nơi giáo dục và trao quyền - thêm những hiểu biết độc đáo vào các giải pháp được cung cấp trước đây có thể khá có giá trị đối với các nhà nghiên cứu.
mickmackusa

Ví dụ, câu trả lời này của tôi đã được đăng một tháng sau khi kỹ thuật tương tự được đăng. Tôi sẽ viết một bình luận dưới câu trả lời trước đó, nhưng khi tôi gõ tất cả thông tin mà tôi muốn cung cấp, rõ ràng là quá nhiều để bình luận hợp lý. Tôi đã đăng một câu trả lời mới và thêm rất nhiều thông tin chi tiết và thông tin cơ bản về kỹ thuật này và bao gồm một điểm chuẩn. Đây là cách một giải pháp không độc đáo có thể có giá trị đối với các nhà nghiên cứu.
mickmackusa

5

Tôi khuyên bạn nên tìm giải pháp của Gordon vì nó hiệu quả hơn chất nền ():

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

xuất ra một cái gì đó như

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

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds

2
Đây phải là một nhận xét về câu trả lời của Gordon.
Ngỗng

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

Không có gì đáng ngạc nhiên vì chất nền () có tổng phí của một lệnh gọi hàm và cái còn lại là thao tác chuỗi trực tiếp "C like". BTW Tôi đã chạy mã này trên PHP 7.1-dev với kết quả: chất nền () mất 7.090255022049 giây giây truy cập mảng mất 2.3145787715912 giây
RyanNerd

4

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

Tôi không nghĩ người hỏi câu hỏi cần điều này, 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 nên tôi chắc chắn những người khác sẽ gặp phải vấn đề tương tự.


2

Bạn có thể tìm thấy ký tự cuối cùng bằng cách sử dụng php theo nhiều cách như chất nền ()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);
?>

BẢN THỬ TRỰC TIẾP


1

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

Biết rằng trong các hoạt động mảng lý thuyết nên nhanh hơn các 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, các hàm mảng tiêu chuẩn như

count();

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


-3

Siemano, chỉ nhận các tập tin php từ thư mụ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 />';
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.