34

PHP配列にインデックスを付けるこれらの方法の違いは何ですか?

$array[$index]
$array["$index"]
$array["{$index}"]

パフォーマンスと機能の違いの両方に興味があります。

アップデート:

(@Jeremy への返信) それが正しいかどうかはわかりません。私はこのコードを実行しました:

  $array = array(100, 200, 300);
  print_r($array);
  $idx = 0;
  $array[$idx] = 123;
  print_r($array);
  $array["$idx"] = 456;
  print_r($array);
  $array["{$idx}"] = 789;
  print_r($array);

そして、この出力を得ました:

Array
(
    [0] => 100
    [1] => 200
    [2] => 300
)

Array
(
    [0] => 123
    [1] => 200
    [2] => 300
)

Array
(
    [0] => 456
    [1] => 200
    [2] => 300
)

Array
(
    [0] => 789
    [1] => 200
    [2] => 300
)
4

7 に答える 7

34

上記の@svecと@jeremyを参照してください。すべての配列インデックスは、最初に「int」型で、次に「string」型であり、PHPが適切と判断したときにそれにキャストされます。

パフォーマンス面では、$indexは「$index」および「{$index}」(同じ)よりも高速である必要があります。

二重引用符の文字列を開始すると、PHPは補間モードに入り、最初に文字列として扱いますが、ローカルスコープから置き換える変数マーカー($、{}など)を探します。これが、ほとんどの議論で、「\n」や「\t」のようなエスケープショートカットが必要でない限り、真の「静的」文字列は常に一重引用符である必要がある理由です。これは、PHPが実行時に文字列を補間しようとする必要がないためです。完全な文字列は静的にコンパイルできます。

この場合、二重引用符は最初に$ indexをその文字列にコピーし、次に文字列を返します。ここで、$indexを直接使用すると文字列が返されます。

于 2008-08-09T05:55:24.187 に答える
29

私はこのようなインデックスを使用する3つの方法の時間を計りました:

for ($ii = 0; $ii < 1000000; $ii++) {
   // TEST 1
   $array[$idx] = $ii;
   // TEST 2
   $array["$idx"] = $ii;
   // TEST 3
   $array["{$idx}"] = $ii;
}

使用されたテストの最初のセット、使用さ$idx=0れた2番目のセット$idx="0"、および使用された3番目のセット$idx="blah"。タイミングはmicrotime()diffを使用して行われました。WinXP、PHP 5.2、Apache 2.2、Vimを使用しています。:-)

そしてここに結果があります:

使用する$idx = 0

$array[$idx]            // time: 0.45435905456543 seconds
$array["$idx"]          // time: 1.0537171363831 seconds
$array["{$idx}"]        // time: 1.0621709823608 seconds
ratio "$idx" / $idx     // 2.3191287282497
ratio "{$idx}" / $idx   // 2.3377348193858

使用する$idx = "0"

$array[$idx]            // time: 0.5107250213623 seconds
$array["$idx"]          // time: 0.77445602416992 seconds
$array["{$idx}"]        // time: 0.77329802513123 seconds
ratio "$idx" / $idx     // = 1.5163855142717
ratio "{$idx}" / $idx   // = 1.5141181512285

使用する$idx = "blah"

$array[$idx]           // time: 0.48077392578125 seconds
$array["$idx"]         // time: 0.73676419258118 seconds
$array["{$idx}"]       // time: 0.71499705314636 seconds
ratio "$idx" / $idx    // = 1.5324545551923
ratio "{$idx}" / $idx  // = 1.4871793473086

$array[$idx]少なくとも私のマシンでは、パフォーマンスコンペティションの勝者もそうです。(結果は非常に再現性がありました、ところで、私はそれを3〜4回実行し、同じ結果を得ました。)

于 2008-08-09T06:10:22.237 に答える
7

パフォーマンスの観点から、$ array["$index"]は$array[$index]よりも高速であると思います。PHPコードのパフォーマンスを最適化するためのベストプラクティスを参照してください。

あなたが読んだすべてを盲目的に信じないでください...あなたはそれを誤解したと思います。記事によると、$array['index']は$array[index]よりも高速です。ここで、indexは変数ではなく、文字列です。これは、引用符で囲まない場合、PHPは定数varを探して見つけることができないため、文字列にするつもりであると想定しているためです。

于 2008-08-09T07:05:44.483 に答える
6

さまざまなインデックス作成方法がさまざまなインデックスに解決されるのはいつですか?

http://php.net/types.arrayによると、配列インデックスは整数または文字列のみにすることができます。floatをインデックスとして使用しようとすると、整数に切り捨てられます。したがって、$indexが値3.14のfloatである場合、は$array[$index]に評価され$array[3]$array["$index"]に評価され$array['3.14']ます。これを確認するコードは次のとおりです。

$array = array(3.14 => 'float', '3.14' => 'string');
print_r($array);

$index = 3.14;
echo $array[$index]."\n";
echo $array["$index"]."\n";

出力:

Array([3] => float [3.14] => string)
float
string
于 2008-08-09T06:30:12.010 に答える
1

アップデートへの対応:

そうです、PHPは、配列のインデックス文字列に数字しか含まれていない場合、それらを数値に変換する必要があると思います。私はこのコードを試しました:

$array = array('1' => 100, '2' => 200, 1 => 300, 2 => 400);
print_r($array);

そして、出力は次のとおりです。

Array([1] => 300 [2] => 400)

さらにいくつかのテストを行ったところ、配列インデックス(またはキー)が数字のみで構成されている場合は常に整数に変換され、そうでない場合は文字列であることがわかりました。

ejunker:

なぜそれが速いのか説明できますか?$ indexをインデックスとして使用するのではなく、インタプリタが「$ index」を文字列に解析してインデックスとして使用するための追加の手順が必要ではありませんか?

于 2008-08-09T05:48:21.487 に答える
0

$index が文字列の場合、$index、"$index"、および "{$index}" はすべて同じ文字列として評価されるため、違いはありません。$index が数値 (たとえば 10) の場合、最初の行は $array[10] と評価され、他の 2 行は $array["10"] と評価されますが、これは $array[10] とは異なる要素です。

于 2008-08-09T05:05:38.203 に答える
-6

パフォーマンスの観点から、$array["$index"] は $array[$index] よりも高速であると考えていますPHP コードのパフォーマンスを最適化するためのベスト プラクティスを参照してください

文字列内に配列がある場合に時々使用する別のバリ​​エーションは次のとおりです。

$str = "this is my string {$array["$index"]}";

編集:私が言いたかったのは、$row['id'] は $row[id] より速いということです

于 2008-08-09T05:30:38.450 に答える