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