web-dev-qa-db-fra.com

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

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

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

65
Ross

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

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

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

Il est sûr de supposer que cela s'appliquerait également à l'utilisation de chaînes comme clés dans des tableaux, mais selon la façon dont PHP gère ses recherches, vous pouvez remarquer une baisse des performances lorsque les chaînes deviennent plus grandes.

17
Lusid

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

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