Индексирование массива PHP: $ array [$ index] vs $ array [«$ index»] vs $ array [«{$ index}»]

В чем разница, если таковая имеется, между этими методами индексации в массиве 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
)
9.08.2008 05:01:38
7 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

33
9.08.2008 05:58:42
Пожалуйста, не миф снова! Там нет ощутимой разницы в скорости между тем или иным видом струн. Даже если есть, строки обрабатываются после загрузки программы, а не перегенерироваться в петлях, так что это все спорно.
Kornel 30.11.2008 03:28:50
насколько я согласен с вашим отвращением к микрооптимизации porneL, некоторые строки необходимо переосмыслить в цикле, например: $ x = array ("w", "y", "x", "z"); for ($ i = 0; $ i <100; $ i ++) {echo "hello world {$ x [$ i% 4]} \ n"; }
Antony Carthy 17.08.2009 09:20:08
@porneL, где доказательства?
Pacerier 7.08.2013 13:04:55
@AntonyCarthy приведенный вами пример не повторяется в цикле. Он анализируется один раз, затем генерируются коды операций для выдачи постоянных и переменных частей строки, и PHP запускает оттуда коды операций.
Kornel 8.08.2013 02:28:37

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

0
9.08.2008 05:05:38
отвечая на очень старый ответ здесь ... но: $array["10"]и $array[10]эквивалентны. «10», будучи числовым целым числом, будет приведено по типу10 (согласно php.net/manual/en/language.types.array.php )
Brad Kent 24.08.2017 13:24:22

С точки зрения производительности, я считаю, что $ array ["$ index"] быстрее, чем $ array [$ index]. См. Рекомендации по оптимизации производительности PHP-кода.

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

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

Редактировать: я хотел сказать, что $ row ['id'] быстрее, чем $ row [id]

-6
9.08.2008 19:08:33

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

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

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

И вывод был:

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

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

ejunker:

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

1
7.02.2016 18:01:42

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

26
7.02.2016 18:01:22
Когда вы используете $ idx = "blah", я думаю, что $ array ["$ idx"] или $ array ["{$ idx}"] следует использовать вместо $ array [$ idx] . Если вы попытаетесь запустить свои тесты в любом проекте, где присутствует много сложностей и логик, а также множество файлов, то вы обнаружите, что использование $ array [$ idx] является несколько плохой идеей, учитывая эффективность / выполнение фактор. Но хорошие результаты теста.
Knowledge Craving 3.08.2010 07:23:08
@KnowledgeCraving, именно поэтому это плохая идея?
Pacerier 7.08.2013 13:06:16

Когда разные методы индексации разрешат разные индексы?

Согласно 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
7.02.2016 18:01:34

С точки зрения производительности, я считаю, что $ array ["$ index"] быстрее, чем $ array [$ index]. См. Рекомендации по оптимизации производительности PHP-кода.

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

7
9.08.2008 07:05:44