Индексация массива PHP:$array[$index] против $array[“$index”] против $array[“{$index}”]
Вопрос
В чем разница, если таковая имеется, между этими методами индексации в массив 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
)
Решение
см. @svec и @jeremy выше.Все индексы массива сначала имеют тип «int», затем тип «строка» и будут преобразованы к этому типу по усмотрению PHP.
С точки зрения производительности, $index должен быть быстрее, чем "$index" и "{$index}" (которые одинаковы).
Как только вы начнете использовать строку в двойных кавычках, PHP перейдет в режим интерполяции и сначала будет рассматривать ее как строку, но ищет маркеры переменных ($, {} и т. д.) для замены из локальной области.Вот почему в большинстве обсуждений настоящие «статические» строки всегда должны быть заключены в одинарные кавычки, если только вам не нужны escape-сокращения, такие как « » или « », потому что PHP не нужно будет пытаться интерполировать строку во время выполнения и полная строка может быть скомпилирована статически.
В этом случае двойные кавычки сначала копируют $index в эту строку, а затем возвращают строку, тогда как непосредственное использование $index просто возвращает строку.
Другие советы
Я рассчитал три способа использования индекса следующим образом:
for ($ii = 0; $ii < 1000000; $ii++) {
// TEST 1
$array[$idx] = $ii;
// TEST 2
$array["$idx"] = $ii;
// TEST 3
$array["{$idx}"] = $ii;
}
Первый набор тестов, использованных $idx=0
, использовался второй набор $idx="0"
, а третий набор использован $idx="blah"
.Тайминг был сделан с использованием microtime()
различия.Я использую 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 раза и получил те же результаты.)
Я считаю, что с точки зрения производительности, что $ array ["$ index"] быстрее, чем $ array [$ index] см. Лучшие практики для оптимизации производительности кода PHP
Не верьте всему, что так слепо читаете...Я думаю, вы неправильно это поняли.В статье говорится, что $array['index'] быстрее, чем $array[index], где индекс является нить, а не переменная.Это потому, что если вы не заключаете его в кавычки, PHP ищет константу var и не может ее найти, поэтому предполагает, что вы хотели сделать ее строкой.
Когда разные методы индексирования будут разрешаться для разных индексов?
В соответствии с http://php.net/types.array, индекс массива может быть только целым числом или строкой.Если вы попытаетесь использовать число с плавающей точкой в качестве индекса, оно будет усечено до целого числа.Так что если $index
является числом с плавающей запятой со значением 3,14, тогда $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
Ответ на обновление:
О, вы правы, я думаю, PHP должен преобразовывать строки индекса массива в числа, если они содержат только цифры.Я попробовал этот код:
$array = array('1' => 100, '2' => 200, 1 => 300, 2 => 400);
print_r($array);
И результат был:
Array([1] => 300 [2] => 400)
Я провел еще несколько тестов и обнаружил, что если индекс массива (или ключ) состоит только из цифр, он всегда преобразуется в целое число, в противном случае это строка.
юнкер:
Можете ли вы объяснить, почему это быстрее?Разве интерпретатору не требуется дополнительный шаг для преобразования «$index» в строку, которая будет использоваться в качестве индекса, вместо того, чтобы просто использовать $index в качестве индекса?
Если $index — это строка, разницы нет, поскольку $index, «$index» и «{$index}» оценивают одну и ту же строку.Если $index — это число, например 10, первая строка будет иметь значение $array[10], а две другие строки — $array["10"], который является элементом, отличным от $array[10].
Я считаю, что с точки зрения производительности $array["$index"] быстрее, чем $array[$index]. См. Лучшие практики по оптимизации производительности PHP-кода
Другой вариант, который я иногда использую, когда у меня есть массив внутри строки:
$str = "this is my string {$array["$index"]}";
Редактировать:Я хотел сказать, что $row[’id’] работает быстрее, чем $row[id]