2016-06-22 6 views
0

Ich brauche einen Rat, wie man ein Stück PHP-Code umschreiben kann, so dass es effizienter auf Speichernutzung ist.array_count_values ​​verwendet mit array_filter erreicht zulässige Speichergröße

Code Beschreibung: I Komma getrennte Werte ist Abrufen (wie a, b, c, d) aus MySQL und Hinzufügen jedes von ihnen in einem neuen String Komma getrennt über while loop. Danach verwende ich array_count_values(array_filter(explode(',',$string), um die Anzahl der Male zu erhalten, die jeder unterschiedliche Wert in der Zeichenfolge enthalten ist.

Der Code selbst funktioniert. Für massive Arrays gibt PHP jedoch einen Fehler Fatal error: Allowed memory size of 524288000 bytes exhausted zurück und ich muss eine Lösung dafür finden.

Hinweis: Ich möchte vermeiden, eine höhere memory_limit in php.ini oder über ini_set zuweisen. Was ich suche, ist eine Lösung, die das gleiche Ergebnis liefert, ohne sich mit Speicherproblemen herumschlagen zu müssen. Ich dachte, dass ich die Wert-Zählung für jeden Loop aufzeichnen kann, aber irgendwie finde ich den richtigen Weg nicht.

Irgendwelche Vorschläge?

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

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

Antwort

0

Warum nicht nur zählen, während Sie gehen?

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

obligatorische Beobachtung, dass storing data this way is generally a bad idea. Wenn Sie eine normalisierte Struktur hätten, könnten Sie nur COUNT in MySQL verwenden.

Verwandte Themen