web-dev-qa-db-ja.com

$ str [0]で文字列の最初の文字を取得する

文字列の最初の文字を取得したいのですが、$str[0]がうまく機能することに気付きました。この表記法は一般的に配列で使用されるため、これが「グッドプラクティス」であるかどうかはわかりません。この機能はあまり文書化されていないようなので、この記法を使用することが大丈夫かどうかを教えてください

それとも私はただ古き良きsubstr($str, 0, 1)に固執するべきですか?

また、中括弧($str{0})も同様に機能することに気付きました。どうしたの?

256
Tatu Ulmanen

はい。文字列は文字配列と見なすことができ、配列の位置にアクセスする方法は[]演算子を使用することです。通常$str[0]を使用してもまったく問題はありません(そしてsubstr()メソッドよりもはるかに速いと確信しています)。

両方の方法に1つだけ注意があります:それらは最初の文字ではなく最初のバイトを取得します。マルチバイトエンコーディング(UTF-8など)を使用している場合、これは重要です。それをサポートしたい場合はmb_substr()を使用してください。おそらく、最近は常にマルチバイト入力を想定する必要があるので、これはbestオプションですが、やや遅くなります。

366
Hock

{}構文はPHP 5.3.0以降では非推奨です。角括弧が推奨されます。

44
Michael Morton

$ _POSTの一部の最初の文字が欲しいとしましょう。それを 'type'と呼びましょう。そしてその$ _POST ['type']は現在 'Control'です。この場合、$_POST['type'][0]またはsubstr($_POST['type'], 0, 1)を使用すると、Cが返されます。

ただし、クライアント側で、たとえばtypeからtype[]に送信するデータを変更してから、この配列のデータとして「Control」と「Test」を送信すると、$_POST['type'][0]ControlではなくCを返します。substr($_POST['type'], 0, 1)単に失敗するだけです。

そのため、$str[0]の使用に問題がある可能性がありますが、それは周囲の状況によって異なります。

22
gattsbr

私の唯一の疑問は、この手法がマルチバイト文字列にどの程度適用できるかということですが、それが考慮事項ではない場合、私はあなたがカバーしていると思います。 (疑わしい場合は、mb_substr()は明らかに安全な選択のようです。)

ただし、全体像から見ると、これが重要な考慮事項となるには、文字列内のn番目の文字にアクセスする必要がある頻度を疑問に思う必要があります。

12
John Parker

リソースによって異なりますが、以下のスクリプトを実行して自分で確認できます。

<?php
$tests = 100000;

for ($i = 0; $i < $tests; $i++)
{
    $string = md5(Rand());
    $position = Rand(0, 31);

    $start1 = microtime(true);
    $char1 = $string[$position];
    $end1 = microtime(true);
    $time1[$i] = $end1 - $start1;

    $start2 = microtime(true);
    $char2 = substr($string, $position, 1);
    $end2 = microtime(true);
    $time2[$i] = $end2 - $start2;

    $start3 = microtime(true);
    $char3 = $string{$position};
    $end3 = microtime(true);
    $time3[$i] = $end3 - $start3;
}

$avg1 = array_sum($time1) / $tests;
echo 'the average float microtime using "array[]" is '. $avg1 . PHP_EOL;

$avg2 = array_sum($time2) / $tests;
echo 'the average float microtime using "substr()" is '. $avg2 . PHP_EOL;

$avg3 = array_sum($time3) / $tests;
echo 'the average float microtime using "array{}" is '. $avg3 . PHP_EOL;
?>

いくつかの参照番号(古いCoreDuoマシン上)

$ php 1.php 
the average float microtime using "array[]" is 1.914701461792E-6
the average float microtime using "substr()" is 2.2536706924438E-6
the average float microtime using "array{}" is 1.821768283844E-6

$ php 1.php 
the average float microtime using "array[]" is 1.7251944541931E-6
the average float microtime using "substr()" is 2.0931363105774E-6
the average float microtime using "array{}" is 1.7225742340088E-6

$ php 1.php 
the average float microtime using "array[]" is 1.7293763160706E-6
the average float microtime using "substr()" is 2.1037721633911E-6
the average float microtime using "array{}" is 1.7249774932861E-6

[]演算子または{}演算子の使用は、ほぼ同じです。

9
Willy Stadnick

単なる人間だと言えば、私は$str[0]を固執するでしょう。私の知る限りでは、substr($str, 0, 1)より一目で$str[0]の意味を把握する方が早いです。これはおそらく好みの問題に帰着するでしょう。

パフォーマンスに関して言えば、プロファイルprofile profileです。 :)それとも、PHPソースコードをのぞき込むこともできます...

6
Stephen
$str = 'abcdef';
echo $str[0];                 // a
5
Jakir Hossain

str[0]を使用しているマルチバイト(Unicode)文字列の場合、問題を引き起こす可能性があります。 mb_substr()はより良い解決策です。例えば:

$first_char = mb_substr($title, 0, 1);

ここにいくつかの詳細があります: UTF-8文字列の最初の文字を取得します

2
Sergey Burish

私は以前からその表記法を使っていましたが、悪い副作用や誤解はありませんでした。意味があります - 結局のところ、文字列は単なる文字の配列です。

1
Kaleb Brasee