301

文字列の最初の文字を取得したいのですが、うまく機能することに気付きました$str[0]。その表記法は一般に配列で使用されるため、これが「良い習慣」であるかどうかはわかりません。この機能は十分に文書化されていないように思われるので、この表記法を使用することがすべての点で問題ないかどうか教えてください。

それとも、古き良きものに固執する必要がありsubstr($str, 0, 1)ますか?

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

4

9 に答える 9

419

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

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

于 2009-12-28T23:31:12.927 に答える
52

{}構文は、PHP5.3.0で非推奨になりました。角かっこをお勧めします。

于 2009-12-28T23:39:37.283 に答える
13

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

ただし、全体像の観点からは、文字列の 'n' 番目の文字にどのくらいの頻度でアクセスする必要があるかを考える必要があります。これが重要な考慮事項となります。

于 2009-12-28T23:31:43.850 に答える
9

リソースによって異なりますが、次のスクリプトを実行して自分の目で確かめてください ;)

<?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演算子の使用は{}多かれ少なかれ同じようです。

于 2014-01-30T19:18:57.220 に答える
8
$str = 'abcdef';
echo $str[0];                 // a
于 2015-03-12T07:06:06.493 に答える
8

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

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

詳細はこちら: UTF-8 文字列の最初の文字を取得する

于 2014-10-16T07:38:37.967 に答える
7

ただの人間として言えば、私は固執し$str[0]ます。私に言わせれば、 より$str[0]一目での意味を理解する方が早いですsubstr($str, 0, 1)。これはおそらく好みの問題に要約されます。

パフォーマンスに関する限り、まあ、プロファイル プロファイル プロファイル。:) または、PHP ソース コードを覗き込むこともできます...

于 2009-12-28T23:32:57.887 に答える
1

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

于 2009-12-28T23:32:28.637 に答える