PHPで文字列の最後の文字を取得する方法は?


回答:


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

または、マルチバイト文字列の場合:

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

114
UTF-8などのマルチバイト文字エンコーディングを使用している場合は、代わりにmb_substrphp.net/mb_substr)を使用してください。
ガンボ

9
私のsubstr($ string、strlen($ string)-1、1);はこれで終わりです。私は長い道のりを歩いてきたようです!
jeffkee 2014年

4
文字列がバイナリ文字列として評価される場合のみ、マルチバイト文字列関数が必要です。別名、phpがエンコーディングを認識していない場合。それ以外の場合、一般的な非マルチバイト文字列関数は問題なく機能します。
Ray Foss


70

または直接文字列アクセスによって:

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

これはマルチバイト文字列では機能しないことに注意してください。マルチバイト文字列を使用する必要がある場合は、文字列ファミリの関数の使用を検討してくださいmb_*

PHP 7.1.0以降、負の数値インデックスもサポートされています。 $string[-1];


2
私はこのCスタイルの答えが好きです。なぜこれがこの少数の賛成票しかないのでしょうか。
Valentin Mercier 2014年

16
@ValentinMercier:これはCではなくPHPの質問であるため
Martin Thoma

1
上記のsubstrのソリューションではできないが、キャラクターを変更できるため、これはより良いソリューションだと思います。
cazort 2017

これは、文字列が空の場合に通知をスローすることに注意してください。
スコットブキャナン

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 Ra​​hmanda、2018年

2
@TaufikNurRahmanda技術的には、[]と{}の間に違いはありません。PHP開発者は、どちらかを使用するオプションを提供しました。詳細については、php.net
manual /

配列アクセスとは何ですか?直接文字列アクセスとは何ですか?@RyanNerd afaikそれらは2つの同じものです、いいえ?
CT。

1
$ string {1}はPHP 7.4で廃止される予定です(RFC:wiki.php.net/rfc/deprecate_curly_braces_array_access
Tony Vlcek

17

コメントを残すことはできませんが、FastTrackの回答に関しては、行末が1文字のみであることも覚えておいてください。私は提案します

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

個人的なことは何もありません。私はあなたの非常に短く冗長な答えを見て、私の笛を吹くことにしました。他の回答に価値がないと感じた場合は、遠慮なくご相談ください。2つの回答が同じテクニックを示唆している可能性があることに注意してください。説明されていることから、どちらも個別に価値があります。これは教育とエンパワーメントの場です。以前に提供されたソリューションに独自の洞察を追加することは、研究者にとって非常に価値があります。
mickmackusa

たとえば、私のこの回答は、同じテクニックが投稿されてから1か月後に投稿されました。以前の回答の下でコメントを書くつもりでしたが、提供したいすべての情報をタイプアウトしたので、明らかにコメントするには多すぎました。私は新しい回答を投稿し、テクニックに関する多くの無料の洞察と背景情報を追加し、ベンチマークを含めました。これは、非ユニークなソリューションが研究者にとってどのように価値があるかです。
mickmackusa

5

それは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
これはゴードンの答えに対するコメントであるべきです。
グース

1
これを確認できます。文字列が長いほど、パフォーマンスの違いは大きくなります。私のテストでは、10文字のsubstrは約20%遅くなっています
Philipp

substr()には関数呼び出しのオーバーヘッドがあり、もう1つは "Cのような"直接文字列操作であるため、当然のことです。ところで、このコードをPHP 7.1-devで実行した結果、substr()は7.090255022049秒かかりました\配列アクセスは2.3145787715912秒かかりました
RyanNerd

4

fgets()関数を使用してテキストファイルから行として読み取られた文字列がある場合substr($string, -3, 1)は、CRLF(復帰改行)の一部ではなく、実際の文字を取得するために使用する必要があることに注意してください。

質問者がこれを必要としていたとは思わないが、私にとって、テキストファイルから文字列からその最後の文字を取得するのに問題があったため、他の人も同様の問題に遭遇すると確信している。


2

最後の文字は、substr()mb_substr()などのさまざまな方法でphpを使用して検索できます。

UTF-8などのマルチバイト文字エンコーディングを使用している場合は、substrではなくmb_substrを使用します

ここで私はあなたに両方の例を示すことができます:

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

ライブデモ


1

Cシャープや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.