Intereting Posts
onchange F (x) – php to Highchart на одной странице Расширение класса MySQLi Laravel 5 Seeder – несколько рядов в DB Как добавить несколько переменных $ _POST и переменных? Есть ли способ получить long / lat для заданного адреса в Картах Google только с PHP? Измените файл конфигурации в скомпилированном установщике Inno Setup (пользовательский файл конфигурации для каждого загружаемого исполняемого файла) Функции функции часового пояса Сервер занимает много времени для ответа Проблема получения изображения для сохранения Использование PhpRenderer непосредственно с дочерними представлениями в ZF2 php curl post данные, чтобы получить форму, указанную в URL Межмодульная связь PDO: имя строки в качестве индекса массива результатов Mysql: случайный сортировка, чем сортировка по определенному столбцу Ошибка входа в систему с помощью tank_auth (библиотека аутентификации codeigniter)

Индексирование массива PHP: $ array vs $ array vs $ array

Какая разница, если таковая имеется, между этими методами индексирования в массив 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]