2011-04-02 91 views
-1

我有這樣的事情:優化PHP條件語句

<?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; 

?> 

的腳本是比這更復雜,但問題的問題僅涉及這一點,很顯然,我得到一個內存不足錯誤。

我該如何解決這個問題?

+0

你在'$ fix1 = in_array($ iffix1)'是無效的(或至少,它沒有這樣做語法你認爲它在做什麼) – Eric 2011-04-02 16:36:10

+0

你究竟想在這裏做什麼? – Eric 2011-04-02 16:36:58

+0

爲什麼有人拒絕這個?這不是一個完全有效的問題嗎? – AJJ 2011-04-02 16:47:31

回答

3

而不必你想要做什麼任何真正的線索,這裏的一些代碼:

$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

$iffix*陣列是非常大的,方含上千項,似乎 - 這需要大量的內存,並能解釋你超越memory_limit,這會導致一個致命錯誤。

最明智的想法是重新思考自己在做什麼,以避免需要太多記憶。

否則,你可能要增加的memory_limit價值 - 但如果這是一個擁有衆多用戶web應用,它可能不是一個好主意......

0

你的整個設計是有問題的。不要使用60個變量,而要使用一組變量(經驗法則:如果變量名中包含數字,則表示錯誤)。代替生成範圍內的所有數字,請使用代表範圍的對象。並且請注意,if ($fix1 = in_array(...))實際上更改了$fix1的值。取而代之的

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

3

你可以做

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

這樣的話,你可以擺脫$iffix -arrays的,所以你就不必存儲約1億陣列整數。另外,檢查兩個外部邊界要快得多,而不是檢查裏面的100萬個整數。

對於其他條件也是如此。