2016-06-22 1 views
0

J'ai besoin d'un conseil pour réécrire un morceau de code PHP, afin qu'il soit plus efficace sur l'utilisation de la mémoire.array_count_values ​​utilisé avec array_filter atteindre la taille de la mémoire autorisée

Code Description: J'Obtention des valeurs séparées par des virgules (comme a, b, c, d) à partir de MySQL et en ajoutant chacun d'entre eux dans une nouvelle chaîne de caractères séparés par des virgules via while loop. Après cela, j'utilise array_count_values(array_filter(explode(',',$string) afin d'obtenir le nombre de fois que chaque valeur différente est contenue dans la chaîne.

Le code lui-même fonctionne. Cependant, pour les tableaux massifs, PHP renvoie une erreur Fatal error: Allowed memory size of 524288000 bytes exhausted et j'ai besoin de trouver une solution pour cela.

Remarque: Je souhaite éviter d'affecter un memory_limit supérieur dans php.ini ou via ini_set. Ce que je cherche est une solution qui donnera le même résultat mais sans avoir à faire face à des problèmes de mémoire. Je pensais que je peux enregistrer le nombre de valeur sur chaque boucle mais de toute façon je ne peux pas trouver la bonne façon de le faire.

Des suggestions?

$options = ''; 
while(!$rs_results->EOF){ 
    $options .= $rs_results->fields['options'].","; 
$rs_results->MoveNext(); 
} 

$arrOptions = array_count_values(array_filter(explode(',', $options))); 

Répondre

0

Pourquoi ne pas compter seulement pendant que vous allez?

$options = []; 
while (!$rs_results->EOF) { 
    if ($rs_results->fields['options']) { 
     foreach (explode(',', $rs_results->fields['options']) as $value) { 
      if (!isset($options[$value])) $options[$value] = 0; 
      ++$options[$value]; 
     } 
    } 
} 

Observation obligatoire que storing data this way is generally a bad idea. Si vous aviez une structure normalisée, vous pourriez simplement les utiliser dans MySQL.