回答:
はい。文字列は文字配列と見なすことができ、配列の位置にアクセスする方法は[]
演算子を使用することです。通常、使用にまったく問題はありません$str[0]
(また、このsubstr()
方法よりもはるかに高速であると確信しています)。
どちらの方法でも注意点は1つだけあります。つまり、最初の文字ではなく最初のバイトを取得します。マルチバイトエンコーディング(UTF-8など)を使用している場合、これは重要です。それをサポートしたい場合は、を使用してください。間違いなく、最近は常にマルチバイト入力を想定する必要があるため、これが最良のオプションですが、少し遅くなります。mb_substr()
mb_substr($str, 0, 1, 'utf-8')
、マルチバイト文字列を切り捨てないようにしてください。
substr($str, 0, 1)
、コードを読む人を混乱させます。
{}構文は、PHP 5.3.0で廃止されました。角括弧が推奨されます。
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose. However, this syntax is deprecated as of PHP 5.3.0. Use square brackets instead, such as $str[42].
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
それで、彼ら{}
がPHP 6の使用がもう廃止されていないと彼らが決めたのではないかと思っています
The curly-brackets-string-index-accessor-syntax does not emit any deprecation notice, although the original notice have been on and off for PHP 5.x, it does not in the current version, thrus we should not label it as deprecated. Related to bug #52254
- svn.php.net/repository/phpdoc/en/trunk/language/types/...
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
この構文はしばらく続くようです。
$ _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]
に問題がある可能性がありますが、それは周囲の状況によって異なります。
if (true === is_string($_POST['type']))
リソースによって異なりますが、以下のスクリプトを実行して、自分で確認できます;)
<?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
[]
or {}
演算子の使用方法はほぼ同じようです。
testA
とtestB
例えばあなたが検出することができる同じループ手段内を実際testB
のキャッシュ・キラー中であるが、testA
キャッシュに優しいです。両方が同じループにある場合、testB
汚染されたtestA
のキャッシュのため、タイミングが非常に同じであると測定されます。
microtime()
実験的にはそうではありますが、呼び出しにかかった時間だけがほとんどの時間差を占めてしまうことを心配しました。真実ではありません)、ここで小さな速度の違いを気にする理由はありません。100分の1秒のほんの一部です。これはいつ問題になるのですか?
$str = 'abcdef';
echo $str[0]; // a
マルチバイト(Unicode)文字列の場合、を使用str[0]
すると問題が発生する可能性があります。mb_substr()
より良いソリューションです。例えば:
$first_char = mb_substr($title, 0, 1);
ここにいくつかの詳細:UTF-8文字列の最初の文字を取得する
私は以前にもその表記法を使用しましたが、悪影響や誤解はありません。結局のところ、文字列は単なる文字の配列です。
$str[42]
。文字列は、この目的のための文字の配列と考えてください。内部的には、PHP文字列はバイト配列です。
$arr[] = $new_element
)は文字列では機能しません。そのため、文字配列を文字配列として考えることは有用ではないと思います。