В чем разница, если таковая имеется, между этими методами индексации в массиве PHP:
$array[$index]
$array["$index"]
$array["{$index}"]
Я заинтересован как в производительности, так и в функциональных различиях.
Обновить:
(В ответ на @ Джереми) Я не уверен, что это правильно. Я запустил этот код:
$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, затем тип string и будут приведены к нему, как PHP сочтет нужным.
С точки зрения производительности, $ index должен быть быстрее, чем "$ index" и "{$ index}" (которые совпадают).
Как только вы начинаете строку в двойных кавычках, PHP переходит в режим интерполяции и сначала обрабатывает ее как строку, но ищет переменные маркеры ($, {} и т. Д.) Для замены из локальной области. Вот почему в большинстве обсуждений истинные «статические» строки всегда должны быть в одинарных кавычках, если только вам не нужны сочетания клавиш «\ n» или «\ t», потому что PHP не нужно будет пытаться интерполировать строку во время выполнения и полная строка может быть скомпилирована статически.
В этом случае двойные кавычки сначала копируют $ index в эту строку, а затем возвращают строку, где прямое использование $ index просто возвращает строку.
Если $ index является строкой, нет никакой разницы, потому что $ index, "$ index" и "{$ index}" все оцениваются в одну и ту же строку. Если $ index - это число, например 10, первая строка будет иметь значение $ array [10], а две другие строки - $ array ["10"], который отличается от $ array [10].
$array["10"]
и $array[10]
эквивалентны. «10», будучи числовым целым числом, будет приведено по типу10
(согласно php.net/manual/en/language.types.array.php )С точки зрения производительности, я считаю, что $ array ["$ index"] быстрее, чем $ array [$ index]. См. Рекомендации по оптимизации производительности PHP-кода.
Другой вариант, который я иногда использую, когда у меня есть массив внутри строки:
$str = "this is my string {$array["$index"]}";
Редактировать: я хотел сказать, что $ row ['id'] быстрее, чем $ row [id]
Ответ на обновление:
О, вы правы, я думаю, PHP должен преобразовывать строки индекса массива в числа, если они содержат только цифры. Я попробовал этот код:
$array = array('1' => 100, '2' => 200, 1 => 300, 2 => 400);
print_r($array);
И вывод был:
Array([1] => 300 [2] => 400)
Я провел еще несколько тестов и обнаружил, что если индекс массива (или ключ) состоит только из цифр, он всегда преобразуется в целое число, в противном случае это строка.
ejunker:
Можете ли вы объяснить, почему это быстрее? Разве интерпретатору не требуется дополнительный шаг, чтобы разобрать «$ index» в строку для использования в качестве индекса вместо того, чтобы просто использовать $ index в качестве индекса?
Я рассчитал 3 способа использования индекса следующим образом:
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 раза и получил те же результаты.)
Когда разные методы индексации разрешат разные индексы?
Согласно 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
С точки зрения производительности, я считаю, что $ array ["$ index"] быстрее, чем $ array [$ index]. См. Рекомендации по оптимизации производительности PHP-кода.
Не верь всему, что ты так слепо читаешь ... Я думаю, ты это неправильно истолковал. В статье говорится, что $ array ['index'] быстрее, чем $ array [index], где index - это строка , а не переменная. Это потому, что если вы не заключите его в кавычки, PHP ищет константу var и не может найти ее, поэтому предполагается, что вы хотели сделать ее строкой.