web-dev-qa-db-ja.com

PHPの配列の最大キーサイズは何ですか?

連想配列を生成していますが、キー値は1..n列の文字列連結です。

私に噛み付くように戻ってくるキーの最大長はありますか?もしそうなら、私はおそらく停止し、別の方法でそれを行います。

65
Ross

スクリプトのメモリ制限によってのみ制限されるようです。

簡単なテストで128MBのキーを問題なく取得できました。

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>";
79
Greg

PHPの文字列サイズに実用的な制限はありません。 マニュアル によると:

注:文字列が非常に大きくても問題ありません。 PHPは、文字列のサイズに境界を課しません。唯一の制限は、PHPが実行されているコンピュータの利用可能なメモリです。

これが配列内のキーとして文字列を使用する場合にも当てはまると想定するのは安全ですが、PHPがその検索を処理する方法によっては、文字列が大きくなるにつれてパフォーマンスが低下することがあります。

17
Lusid

Zend_hash.hには、PHPでキー文字列をハッシュする方法を示すzend_inline_hash_func()メソッドがあります。したがって、パフォーマンスのために、文字列の長さが8文字未満のキーを使用してください。

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;   
}
5
Bob Bao