Какая форма правильная? - PullRequest
0 голосов
/ 21 апреля 2009

PHP.

$a['0']=1;
$a[0]=2;

Какая форма правильная?

Ответы [ 6 ]

8 голосов
/ 21 апреля 2009

В первом примере вы используете строку для индексации массива, которая будет хеш-таблицей «под капотом», что медленнее. Чтобы получить доступ к значению, «число» вычисляется из строки, чтобы найти значение, которое вы сохранили. Этот расчет занимает время.

Второй пример - массив, основанный на числах, который работает быстрее. Массивы, которые используют числа, будут индексировать массив в соответствии с этим числом. 0 - это индекс 0; 1 - это индекс 1. Это очень эффективный способ доступа к массиву. Никаких сложных расчетов не требуется. Индекс - это просто смещение от начала массива для доступа к значению.

Если вы используете только цифры, то вы должны использовать цифры, а не строки. Это не вопрос формы, это вопрос о том, как PHP оптимизирует ваш код. Числа быстрее.

Однако различия в скорости незначительны при работе с небольшими размерами (массивы, хранящие менее 10000 элементов; спасибо Paolo;)

4 голосов
/ 21 апреля 2009

Самое смешное, вы получите точно такой же результат. PHP (по любой причине) проверяет, содержит ли строка, используемая в качестве индекса массива, только цифры. Если это так, строка преобразуется в int или double.

<?php
$x=array(); $x['0'] = 'foo';
var_dump($x);

$x=array(); $x[0] = 'foo';
var_dump($x);

Для обоих массивов вы получаете [0] => foo, а не ["0"] => foo.

Или другой тест:

<?php
$x = array();
$x[0] = 'a';
$x['1'] = 'b';
$x['01'] = 'c';
$x['foo'] = 'd';</p>

<p>foreach( $x as $k=>$v ) {
  echo $k, ' ', gettype($k), "\n";
}
0 integer
<b>1 integer</b>
01 string
foo string

Если вы все еще не верите, посмотрите на #define HANDLE_NUMERIC (key, length, func) в zend_hash.h и когда и где он используется.

Вы думаете, что это странно? Выберите номер и встаньте в очередь ...

4 голосов
/ 21 апреля 2009

В первом у вас будет элемент массива: Ключ: 0 Индекс: 0

Во втором примере у вас есть только набор индексов. Индекс: 0

$arr = array();
$arr['Hello'] = 'World';   
$arr['YoYo']  = 'Whazzap'; 
$arr[2]       = 'No key';  // Index 2
2 голосов
/ 21 апреля 2009

Если вы планируете увеличивать свои ключи, используйте второй вариант. Первый - это ассоциативный массив, который содержит строку «0» в качестве ключа.

1 голос
/ 22 апреля 2009

Они оба "правильные", но имеют разные побочные эффекты, как отмечали другие.

Еще одна вещь, на которую я хотел бы обратить внимание: если вы просто помещаете элементы в массив, вы можете предпочесть следующий синтаксис:

$ a = array (); $ a [] = 1; $ a [] = 2; // теперь $ a [0] равно 1, а $ a [1] равно 2.

0 голосов
/ 21 апреля 2009

они оба хороши, они оба будут работать.

Разница в том, что на первом вы устанавливаете значение 1 для клавиши с именем '0' во втором примере вы устанавливаете значение 2 для первого элемента в массиве.

не путайте их случайно;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...