67 votes

Quelle est la taille de clé maximale pour un tableau en PHP?

Je génère des tableaux associatifs et la valeur de la clé est un concat de chaîne de 1..n colonnes.

Y at-il une longueur maximale pour les clés qui vont revenir me mordre? Si c'est le cas, je vais probablement m'arrêter et le faire différemment.

81voto

Greg Points 132247

Il semble être limité uniquement par la limite de mémoire du script.

Un test rapide m'a permis d'obtenir une clé de 128 Mo sans problème:

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

17voto

Lusid Points 2475

Il n'y a pas de limite pratique à la taille de la chaîne en PHP. Selon le manuel:

Remarque: Il n'est pas un problème pour une chaîne de devenir très volumineux. PHP n'impose aucune limite sur la taille d'une chaîne; seule limite est la mémoire de l'ordinateur sur lequel PHP est en cours d'exécution.

Il est sûr de supposer que cela s'appliquerait à l'aide de cordes comme clés dans des tableaux en tant que bien, mais selon ce que PHP gère ses recherches, vous remarquerez peut-être un gain de performance que les chaînes sont de plus en plus.

5voto

Bob Bao Points 31

Dans zend_hash.h, vous pouvez trouver la méthode zend_inline_hash_func() qui peut montrer comment hacher une chaîne de clé en PHP. Utilisez donc une clé dont la longueur de chaîne est inférieure à 8 caractères est meilleure pour la performance.

 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;   
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X