2011-02-17 177 views
1

好吧,我測試接下來,我會只是讓你知道我的發現:邏輯問題

echo ('-1' < 0) ? 'true' : 'false'; // will echo "true" 
echo ('1' > 0) ? 'true' : 'false'; // will echo "true" 
# Notice that '-1' and '1' are strings 

現在,讓我們的數組,從數據庫來過濾所有結果以後只獲得UID = 1的行。

$this->a = array(
    [0] => array(
     'UID' => '1', 
     'PID' => '91', 
     'Amount' => '-1' 
    ), 
    [1] => array(
     'UID' => '1', 
     'PID' => '92', 
     'Amount' => '1' 
    ), 
    [2] => array(
     'UID' => '1', 
     'PID' => '93', 
     'Amount' => '1' 
    ) 
); 

現在我想創建一個函數posAmount($PID)返回true如果'Amount' > 0false如果'Amount' < 0。 (注意:金額= 0是我不太在乎的東西)。另外我想寫作類似的功能,稱爲negAmount($PID),返回第一個完全相反。我想,現在,把你介紹給我的兩大職能:

public function posAmount($pid) 
{ 
    foreach ($this->a as $a) 
    { 
     if (count($this->a) == 0) { return false; } 
     return ($a['PID'] == $pid and $a['Amount'] > 0) ? true : false; 
    } 
} 

public function negAmount($pid) 
{ 
    foreach ($this->a as $a) 
    { 

     if (count($this->a) == 0) { return false; } 
     return ($a['PID'] == $pid and $a['Amount'] < 0) ? true : false; 
    } 
} 

涼爽的事實,關於第一陣列(其中,我與var_dump()檢查保持其性質低谷整個腳本)是:

$istance->negAmount(91); // Returns true, as expected 
$istance->posAmount(92); // Returns false, as NOT expected. 
# Why do God wants me to get mad? 
+1

必須是該行:'如果(計數($這個 - >票)== 0){返回false; }`` – BoltClock 2011-02-17 18:21:18

+0

返回($一個[ 'PID'] == $ PID和$一個[ '量'] <0)?真:FALSE`可以寫成`回報($ A [ 'PID'] == $ PID和$一個[ '量'] <0)`爲什麼你叫'如果(計數($這個 - >票) == 0){return false; }在每個循環迭代中?這是一個不好的做法。 – 2011-02-17 18:22:09

+0

@BoltClock,不,那是一個錯字。對不起。 – Shoe 2011-02-17 18:22:55

回答

5

問題是,你總是返回foreach循環的第一次迭代。所以在這裏

public function negAmount($pid) { 
    if (count($this->a) == 0) { return false; } 
    foreach ($this->a as $a) { 
     if ($a['PID'] == $pid) { 
      if ($a['Amount'] < 0) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

public function posAmount($pid) { 
    if (count($this->a) == 0) { return false; } 
    foreach ($this->a as $a) { 
     if ($a['PID'] == $pid) { 
      if ($a['Amount'] > 0) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
0

問題是你試圖比較一個字符串到一個int而不嘗試轉換它。將$a['Amount']更改爲(int)$a['Amount'],看看會發生什麼。

2

可能只是在你的演示代碼一個錯字,但posAmount方法是循環$this->a,而另一種是循環$this->votes - OP修正

你必須在你的代碼中的一些奇怪的事情。你爲什麼要從foreach循環中檢查$this->a的計數?在開始循環之前檢查計數會更有意義。

而且,你有你的一些比較邏輯錯誤。你只是比較循環中的第一個迭代......它將爲數組的第一個索引返回true或false,而不會查看其他數據。在比較任何事物並返回之前,您需要在循環中匹配PID。像這樣:

public function posAmount($pid) 
{ 
    if (count($this->a) == 0) { return false; } 
    foreach ($this->votes as $a) { 
     if ($a['PID'] == $pid) 
     return $a['Amount'] > 0 ? true : false; 
    } 
    return false; 
} 

public function posAmount($pid) 
{ 
    if (count($this->a) == 0) { return false; } 
    foreach ($this->votes as $a) { 
     if ($a['PID'] == $pid) 
     return $a['Amount'] < 0 ? true : false; 
    } 
    return false; 
} 
0

你迭代這個 - $> A:你應該重寫功能,這樣

public function posAmount($pid) 
{ 
    foreach ($this->a as $a) 

但是在這裏$這個 - >票:

public function posAmount($pid) 
{ 
    foreach ($this->a as $a) 

錯字或什麼...