PHP中的逻辑问题

时间:2011-02-17 18:18:47

标签: php logic

好的,我测试了以下内容,我会让你知道我发现了什么:

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?

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

可能只是您的演示代码中的拼写错误,但posAmount方法正在循环$this->a,而另一种方法是循环$this->votes - OP已更正

你的代码中有一些奇怪的东西。为什么要在$this->a循环中检查foreach的计数?在开始循环之前检查计数会更有意义。

此外,您在比较中遇到了一些逻辑错误。您只是将第一次迭代与循环进行比较...它将为数组的第一个索引返回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;
}

答案 2 :(得分:0)

问题是你试图将字符串与int进行比较而不尝试转换它。将$a['Amount']更改为(int)$a['Amount'],看看会发生什么。

答案 3 :(得分:0)

所以在这里你迭代$ this-&gt; a:

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

但是这里$ this-&gt;投票:

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

错字或什么......