PHP bir dizi için maksimum anahtar boyutu nedir?

3 Cevap php

Ben ilişkilendirilebilir diziler üreten yaşıyorum ve anahtar değeri bir dize 1 concatı .. n sütun olduğunu.

Beni ısırmak için geri gelecek tuşları için maksimum uzunluğu var mı? Eğer öyleyse, muhtemelen durdurmak ve farklı yapacağım.

3 Cevap

Sadece betiğin bellek sınırı ile sınırlı gibi görünüyor.

Hızlı bir test bana hiçbir sorun 128MB anahtar var:

ini_set('memory_limit', '1024M');

$key = str_repeat('x', 1024 * 1024 * 128);

$foo = array($key => $key);

echo strlen(key($foo)) . "<br>";
echo strlen($foo[$key]) . "<br>";

PHP dize büyüklüğü için pratik bir sınır yoktur. Göre the manual,

Note: It is no problem for a string to become very large. PHP imposes no boundary on the size of a string; the only limit is the available memory of the computer on which PHP is running.

Dizeleri büyük olsun bu sıra dizilerde dizeleri anahtar olarak kullanan, ancak PHP onun aramalarını nasıl işleyeceğini bağlı olarak geçerli olacağını varsaymak güvenlidir, bir performans isabet fark edebilirsiniz.

Zend_hash.h olarak, PHP anahtar dize karma nasıl gösterebilir zend_inline_hash_func() yöntemi bulmak, Yani 8 karakterden daha az performans için daha iyi dize uzunluğu tuşunu kullanabilirsiniz.

static inline ulong zend_inline_hash_func(char *arKey, uint nKeyLength) {

register ulong hash = 5381;

/* variant with the hash unrolled eight times */
for (; nKeyLength >= 8; nKeyLength -= 8) {
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
}
switch (nKeyLength) {
    case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 1: hash = ((hash << 5) + hash) + *arKey++; break;
    case 0: break;  EMPTY_SWITCH_DEFAULT_CASE()
}
    return hash;   
}