2011-04-02 2 views
-1

J'ai quelque chose comme ceci:php Optimisation conditionals

<?php 

$fix1 = XXXXXXX //Integer. Problem isn't here. Extracted automatically 

$iffix1 = range(9000000,8000000); 
$iffix2 = range(7999999,7888888); 
... 

//There're more iffix[XX]s, up to $iffix60 

if($fix1 = in_array($iffix1)) { 
    $var1 = 1; 
} elseif($fix2 = in_array($iffix2)){ 
    $var2 = 2; 
} .... 

//I have 60 more elseifs as well 

$result = $var1 * $fix1; 
echo $result; 

?> 

Le script est plus compliqué que cela, mais la question de la question ne concerne que ce bit, De toute évidence, je reçois une erreur à faible mémoire.

Comment puis-je résoudre ce problème?

+0

Votre syntaxe à '$ fix1 = in_array (iffix1 $)' est invalide (ou du moins, il ne fait ce que vous pensez qu'il fait) – Eric

+0

Qu'est-ce que vous essayez réellement de faire ici? – Eric

+0

Pourquoi quelqu'un a-t-il voté contre? N'est-ce pas une question parfaitement valable? – AJJ

Répondre

3

Sans avoir aucune idée réelle de ce que vous essayez de faire, voici un code:

$ranges = array(
    array(8000000,9000000), 
    array(7888888,7999999), 
    ... 
); 

$fix = 1234567; 
$var = 0; 

foreach($ranges as $range) { 
    $var++; 
    if($range[0] < $fix1 && $fix1 < $range[1]) 
     break; 
} 

echo $fix * $var 
0

Vos tableaux $iffix* sont vraiment grands, contenant des milliers d'éléments, il semble - ce qui nécessite beaucoup de mémoire, et peut vous expliquer aller au-delà de memory_limit, ce qui provoque une erreur fatale. L'idée la plus sage serait de repenser ce que vous faites, pour éviter d'avoir besoin de tant de mémoire.

Sinon, vous aurez probablement à augmenter la valeur de memory_limit - mais si cela est pour une application Web avec de nombreux utilisateurs, il est sans doute pas une bonne idée ...

0

Votre dessin est discutable. Au lieu d'avoir 60 variables, utilisez un tableau de variables (règle générale: si vous avez des nombres dans votre nom de variable, vous vous trompez). Au lieu de générer tous les nombres dans une plage, utilisez un objet représentant la plage. Et sachez que if ($fix1 = in_array(...)) change réellement la valeur de $fix1.

3

Au lieu de

if($fix1 == in_array($iffix1)){ 

vous pourriez faire

if($fix1 >= 8000000 && $fix1 <= 9000000) { 

De cette façon, on pouvait se débarrasser des $iffix -arrays, de sorte que vous n'auriez pas à stocker un tableau de ~ 1 million entiers. En outre, il est beaucoup plus rapide de vérifier les deux limites extérieures, plutôt que de vérifier chacun des 1 million d'entiers à l'intérieur.

Il en va de même pour les autres conditions.