Каковы различия Array и Hash в PHP? - PullRequest
5 голосов
/ 20 мая 2009

В чем разница между массивом и хэшем PHP?

Массив: array(1,2,3...)
Хеш: array(key1=value1, key2=value2, ...)

они разные или одинаковые?

※ Например, аргументы функции позволяют массиву быть эффективным для хеша?

Поскольку я выделяю его обычным языком и использовал его, я озадачен.

Ответы [ 3 ]

15 голосов
/ 20 мая 2009

Обе вещи, которые вы описываете, являются массивами. Единственное различие между ними состоит в том, что вы явно устанавливаете ключи для второго, и поэтому они известны как ассоциативные массивы . Я не знаю, откуда вы взяли терминологию Hash (Perl?), Но это не то, на что они ссылаются в PHP.

Так, например, если вы должны были сделать это:

$foo = array(1,2,3,4,5);
print_r($foo);

Вывод будет:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Как видите, ключи для доступа к введенным вами индивидуальным значениям созданы для вас, но, тем не менее, существуют. Так что этот массив, по сути, также ассоциативный. Другой «тип» массива точно такой же, за исключением того, что вы прямо говорите «Я хочу получить доступ к этому значению с помощью этого ключа» вместо автоматических числовых индексов (хотя ключ Вы также можете указать число).

$bar = array('uno' => 'one', 'dos' => 'two');
print_r($bar);

Будет выводить:

Array
(
    [uno] => one
    [dos] => two
)

Как и следовало ожидать, выполнение print $bar['one'] приведет к выводу uno, а выполнение $foo[0] из первого примера приведет к выводу 1.

Что касается функций, функции PHP в большинстве случаев будут использовать один из этих «типов» массивов и делать то, что вам нужно, но есть некоторые отличия, о которых следует помнить, поскольку некоторые функции будут выполнять интересные вещи. на ваши индексы, а некоторые не будут. Обычно лучше прочитать документацию перед использованием функции массива, так как в ней будет указано, какой вывод будет зависеть от ключей массива.

Вы должны прочитать руководство для получения дополнительной информации.

1 голос
/ 13 сентября 2013

В движок php все массивы (ассоциативные или последовательные) являются хеш-таблицами, и это потому, что это самый быстрый метод при чтении одного элемента. Внутри есть основные функции для создания и заполнения массива:

int zend_hash_init(HashTable *ht, uint nSize,hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent);

int zend_hash_add(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)

int zend_hash_update(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)

int zend_hash_index_update(HashTable *ht, ulong h, void *pDate, uinit nDataSize, void **pDest)

int zend_hash_next_index_insert(HashTable *ht, void *pData, uinit nDataSize, void **pDest)

int zend_hash_add(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)

int zend_hash_update(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)

int zend_hash_index_update(HashTable *ht, ulong h, void *pDate, uinit nDataSize, void **pDest)

int zend_hash_next_index_insert(HashTable *ht, void *pData, uinit nDataSize, void **pDest)

......

1 голос
/ 20 мая 2009

На самом деле в php нет массивов - есть только ассоциативные массивы (которые по сути являются хеш-таблицами)

Попробуйте сделать

$ar=array("zero","one","two","three","four");
unset($ar[3]);

это удалит «три» из массива, но вы заметите, что ключи массива (массив не ассоциативен) останутся прежними (0,1,2,4) - на любом нормальном языке перенумеровать ключ на «четыре» на 3.

...