PHP에서 문자열의 마지막 문자를 얻는 방법?


답변:


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

또는 멀티 바이트 문자열의 경우 :

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

114
UTF-8과 같은 멀티 바이트 문자 인코딩을 사용하는 경우 대신 mb_substr( php.net/mb_substr )을 사용하십시오.
Gumbo

9
내 substr ($ string, strlen ($ string) -1, 1);에 대해 너무 많이. 내가 오랫동안 길을 갔다!
jeffkee

4
문자열이 이진 문자열로 평가되는 경우 멀티 바이트 문자열 함수 만 필요합니다. PHP가 인코딩을 모르는 경우 일명. 그렇지 않으면 일반적인 비 멀티 바이트 문자열 함수는 정상적으로 작동합니다.
Ray Foss


70

또는 직접 문자열 액세스 :

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

멀티 바이트 문자열에서는 작동하지 않습니다. 멀티 바이트 문자열을 사용해야하는 경우 문자열 계열 함수 사용을 고려하십시오 mb_*.

PHP 7.1.0부터 음수 숫자 인덱스도 지원됩니다. $string[-1];


2
나는이 C 스타일 답변을 좋아하는데 왜 이것이 왜 소수의 공감대를 얻었는지 궁금합니다.
Valentin Mercier

16
@ValentinMercier :이 질문은 C가 아닌 PHP 질문이므로
Martin 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.0334868431091seconds

배열 접근에 2.3111131191254seconds가 소요됨

직접 문자열 액세스 (음수 문자열 오프셋)에 1.7971360683441 초가 걸렸습니다.


벤치 마크를 게시 해 주셔서 감사합니다! 동일한 작업을 수행하는 C # 벤치 마크에 관심이있는 사람이라면 이 페이지 를 읽어보십시오. 마지막 캐릭터에 직접 액세스하여 승리했습니다.

이 맥락에서 []와 {}의 차이점에 대해 더 자세히 설명해 주시겠습니까?
Taufik Nur Rahmanda

2
@TaufikNurRahmanda 기술적으로 []와 {}의 차이는 없습니다. PHP 개발자는 둘 중 하나를 사용할 수있는 옵션을 제공했습니다. 자세한 내용은 다음을 참조하십시오 : php.net/manual/en/migration71.new-features.php
RyanNerd

배열 액세스 란 무엇이며 직접 문자열 액세스 란 무엇입니까? @RyanNerd afaik 그것들은 2 가지입니다.
CT.

1
$ 문자열 {1} PHP 7.4에서 더 이상 사용되지 않습니다 (RFC : wiki.php.net/rfc/deprecate_curly_braces_array_access )
토니 블 체크

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

substr ()보다 성능이 우수하므로 Gordon의 솔루션을 사용하는 것이 좋습니다.

<?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
이것은 Gordon의 답변에 대한 의견이어야합니다.
거위

1
이것을 확인할 수 있습니다. 줄이 길수록 성능 차이가 커집니다. 10자를 사용한 테스트에서 substr은 약 20 % 느립니다.
Philipp

substr () 함수 호출 오버 헤드가 있고 다른 하나는 "C like"직접 문자열 조작이기 때문에 놀라운 것은 아닙니다. BTW 필자는 PHP 7.1-dev에서이 코드를 결과와 함께 실행했습니다. substr ()은 7.090255022049seconds \ 배열 액세스는 2.3145787715912seconds
RyanNerd

4

fgets()함수를 사용하여 텍스트 파일에서 행으로 읽은 문자열이있는 substr($string, -3, 1)경우 CRLF (Carriage Return Line Feed)의 일부가 아닌 실제 문자를 얻도록 사용해야합니다.

나는 질문을 한 사람이 이것이 필요하다고 생각하지 않지만 나에게는 텍스트 파일의 문자열에서 마지막 문자를 얻는 데 어려움이 있었으므로 다른 사람들이 비슷한 문제를 겪을 것이라고 확신합니다.


2

substr ()mb_substr () 과 같은 여러 가지 방법으로 PHP를 사용하여 마지막 문자를 찾을 수 있습니다 .

UTF-8과 같은 멀티 바이트 문자 인코딩을 사용하는 경우 substr 대신 mb_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.