2010-01-15 6 views
0

Je peux me tromper, mais jetez un coup d'œil. Si je code en dur la logique, cela fonctionne mais pas si j'essaie de l'utiliser comme variable.Si la déclaration ne semble pas fonctionner correctement

if($range <= 50) { 
    $operator = "<="; 
} else { 
    $operator = ">="; 
} 

foreach($cursor as $s) { 
    $data = round($this->distance($zip_lat, $zip_lon, $s["lat"],$s["lon"]), 2); 

    if ($data .$operator. $range) { 
     $zipcodes[] = "$s[zipcode]"; 
    } 
}    

Je veux dire, je pourrais ajouter if/else à l'intérieur du foreach mais était pas sûr si elle ajoute une « surcharge ».

+2

Cela ne devrait-il pas être opérateur = ">" pour la partie else? –

+2

D'autres ont déjà résolu votre problème, mais pas exactement expliqué le problème. La raison pour laquelle votre code ne fonctionne pas est ce $ data. $ opérateur. $ range évalue à une chaîne, pas une expression booléenne comme vous l'utilisez, et une chaîne non vide, non nulle, évalue toujours à vrai. –

+0

lol @ titre: Je pense que la plupart des langues auront sûrement assuré que l'instruction 'if' fonctionne correctement ;-) – ChristopheD

Répondre

5

essayer:

if ($range <= 50 ? $data <= $range : $data >= $range) { 

} 

ou utiliser un eval()

+0

parfait, cela semble fonctionner. Alors disons que j'ai ajouté le "if/else" supplémentaire depuis le début de mon code dans la boucle foreach, cela ajouterait-il "overhead?" – luckytaxi

+1

@luckytaxi, ne vous inquiétez pas de l'overhead d'un IF supplémentaire en PHP, l'ensemble est gonflé de toute façon et ne fera pas 0.00001% de différence à votre temps de fonctionnement! –

+0

Pourquoi êtes-vous si inquiet au sujet des «frais généraux»? Est-ce un goulot d'étranglement connu (sérieusement, je pense que vous optimisez prématurément)? – ChristopheD

0

Vous semblez manquer une fermeture}

+0

hah, oui juste attrapé ça. Merci. Je l'ai dans mon code cependant. – luckytaxi

0

Je pense que vous allez avoir besoin de le faire:

foreach ($cursor as $s) { 
    $data = round($this->distance($zip_lat, $zip_lon, $s["lat"],$s["lon"]), 2); 
    if ($range <= 50) { 
     if ($data <= $range) { 
      $zipcodes[] = "$s[zipcode]"; 
     } 
    } else { 
     if ($data >= $range) { 
      $zipcodes[] = "$s[zipcode]"; 
     } 
    } 
} 
4
if ($data .$operator. $range) 

Est toujours vrai, parce que utilisez-le est une chaîne, pas un null.

Vous pouvez trouver problème en utilisant ce code simple:

$data="0"; 
$operator=">="; 
$range="1"; 

if ($data .$operator. $range) { 
     echo $data .$operator. $range . " is true !"; 
}     
+0

Je ne suis pas d'accord avec la partie 'always', considérons: '$ data = '0'; $ operator = ''; $ range = ''; if ($ data. $ operator. $ range) {echo 'cette affirmation est toujours vraie'; }; ' – ChristopheD

0

Vous ne pouvez pas avoir une variable représentant un opérateur d'évaluation. Vous devrez changer votre code à quelque chose comme:

foreach ($cursor as $s) { 
    $data = round($this->distance($zip_lat, $zip_lon, $s["lat"],$s["lon"]), 2); 
    if ($range <= 50 && $data <= $range) { 
     $zipcodes[] = $s['zipcode']; 
    } else if ($data >= $range) { 
     $zipcodes[] = $s['zipcode']; 
    } 
} 
1

Les « points » ne concaténer « string » régulière - vous ne pouvez pas les attendre (injecté sous forme de chaînes) à se comporter comme des opérateurs réguliers, « vrais » .

Pensez-y: si $data = 'data1' et $range = 50 votre instruction if devient:

if ('data1<=50') qui probablement évaluer à vrai ou faux, tout comme if ('yournamehere') ou if('randommumbojumbo')

+0

à droite, mais comme dans mon cas, $ data et $ range sont des chiffres numériques, j'ai pensé que je pouvais lancer le" operator "dans le mix. – luckytaxi

1

Je suis très suspect que le cas est tout simplement évaluer la chaîne $ date. $ operator. $ range (qui retournera toujours true), car tout ce que vous faites est de concaténer l'opérateur et les opérandes ensemble.

En tant que tel, vous devrez peut-être eval (canard et couvrir les gens, le canard et la couverture) le contenu de l'if.

+0

Oui, c'est exactement ce qu'il fait comme défini par l'opérateur de concaténation. Pas besoin de se douter de rien;) +1 pour le canard et la couverture – phant0m

Questions connexes