Какая разница, если таковая имеется, между этими методами индексирования в массив 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» сначала, затем введите «string» и будут приведены к тому, что PHP считает нужным.
Производительность, индекс $ index должен быть быстрее, чем «$ index» и «{$ index}» (что одинаково).
После того, как вы начнете строку с двойной кавычкой, PHP перейдет в режим интерполяции и сначала обработает его как строку, но ищет переменные маркеры ($, {} и т. Д.) Для замены из локальной области. Вот почему в большинстве обсуждений истинные «статические» строки всегда должны быть одинарными кавычками, если вам не нужны ярлыки escape-команд типа «\ n» или «\ t», потому что PHP не нужно будет пытаться интерполировать строку во время выполнения, а полная строка может быть скопирована статически.
В этом случае doublequoting сначала скопирует $ 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()
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]
является победителем конкурса производительности, по крайней мере, на моей машине. (Результаты были очень повторяемы, BTW, я побежал 3 или 4 раза и получил те же результаты).
С точки зрения производительности я полагаю, что $ array ["$ index"] быстрее, чем $ array [$ index] См. Рекомендации по оптимизации производительности кода PHP
Не верьте всему, что вы читаете так слепо … Я думаю, вы неверно истолковали это. В статье говорится, что $ array ['index'] быстрее, чем $ array [index], где index – это строка , а не переменная. Это потому, что если вы не завершаете его в кавычки, PHP ищет постоянный var и не может найти его, поэтому предполагает, что вы хотите сделать его строкой.
Когда различные методы индексирования будут разрешены для разных индексов?
Согласно http://php.net/types.array , индекс массива может быть только целым числом или строкой. Если вы попытаетесь использовать float в качестве индекса, он усекает его до целого. Поэтому, если $index
– это float со значением 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)
Я сделал еще несколько тестов и обнаружил, что если индекс (или ключ) массива состоит из только цифр, он всегда преобразуется в целое число, иначе это строка.
ejunker:
Можете ли вы объяснить, почему это происходит быстрее? Не требует ли интерпретатор дополнительного шага для анализа «$ 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]