Индексация массива PHP: $array [$index] по сравнению с $array [“$index”] по сравнению с $array [“{$index}”]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

30
задан nyuszika7h 1 May 2011 в 09:56
поделиться

7 ответов

см. @svec и @jeremy выше. Все индексы массива имеют тип 'интервал' сначала, затем вводят 'строку' и будут брошены, к которому как PHP считает целесообразным.

мудрая Производительность, $index должен быть быстрее, чем "$index" и "{$index}" (которые являются тем же).

, Как только Вы запускаете строку двойной кавычки, PHP будет входить в режим интерполяции и рассматривать его как строку сначала, но поиск переменных маркеров ($, {}, и т.д.) для замены от локального объема. Поэтому в большинстве обсуждений, истинные 'статические' строки должны всегда быть одинарными кавычками, если Вам не нужны ярлыки Escape как "\n" или "\t", потому что PHP не должен будет пытаться интерполировать строку во времени выполнения, и полная строка может быть скомпилирована статически.

В этом случае, doublequoting сначала скопирует $index в ту строку, затем возвратить строку, куда непосредственно использующий $index просто возвратит строку.

33
ответ дан 27 November 2019 в 23:34
поделиться

Я синхронизировал 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() diffs. Я использую 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

Используя [1 110]

$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 раза и получил те же результаты.)

26
ответ дан Markus Safar 27 November 2019 в 23:34
поделиться

я полагаю с точки зрения производительности, что $array [" $index"] быстрее, чем $array [$index] Видят, что Лучшие практики для оптимизации производительности кода PHP

не верят всему, что Вы читаете так вслепую... Я думаю, что Вы неправильно истолковали это. В статье говорится, что $array ['индекс'] быстрее, чем $array [индекс], где индекс строка , не переменная. Поэтому, если Вы не обертываете его в кавычки, PHP ищет постоянный var и не может найти, что тот так предполагает, что Вы означали делать его строкой.

7
ответ дан Akira 27 November 2019 в 23:34
поделиться

, Когда различные методы индексирования решат к различным индексам?

Согласно 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
6
ответ дан Markus Safar 27 November 2019 в 23:34
поделиться

Ответ на Обновление:

, О, Вы правы, я предполагаю, что PHP должен преобразовать строки индекса массива в числа, если они содержат только цифры. Я попробовал этот код:

$array = array('1' => 100, '2' => 200, 1 => 300, 2 => 400);
print_r($array);

И вывод был:

Array([1] => 300 [2] => 400)

я сделал еще некоторые тесты и нашел, что, если индекс массива (или ключ) составлен только из цифр, это всегда преобразовывается в целое число, иначе это - строка.

ejunker:

можно ли объяснить, почему это быстрее? Разве это не делает интерпретатору дополнительный шаг для парсинга "$index" в строку для использования в качестве индекса вместо того, чтобы просто использовать $index в качестве индекса?

1
ответ дан Markus Safar 27 November 2019 в 23:34
поделиться

Если $index является строкой нет никакого различия, потому что $index, "$index" и "{$index}" все оценивают к той же строке. Если $index будет числом, например, 10, первая строка оценит к $array [10], и другие две строки оценят к $array ["10"], который является различным элементом, чем $array [10].

0
ответ дан Jeremy Ruten 27 November 2019 в 23:34
поделиться

Я полагаю с точки зрения производительности, что $array [" $index"] быстрее, чем $array [$index] Видят Лучшие практики для оптимизации производительности кода PHP

Другое изменение, которое я использую иногда, когда у меня есть массив в строке:

$str = "this is my string {$array["$index"]}";

Редактирование: То, что я означал говорить, является $row [’id’], быстрее, чем $row [идентификатор]

-6
ответ дан ejunker 27 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: