Логическая проблема в PHP - PullRequest
       6

Логическая проблема в PHP

1 голос
/ 17 февраля 2011

Хорошо, я проверил то, что следует, и я просто сообщу вам, что я обнаружил:

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' > 0 или false, если 'Amount' < 0. (Обратите внимание: Amount = 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 ]

5 голосов
/ 17 февраля 2011

Проблема в том, что вы всегда возвращаетесь на первой итерации цикла 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;
}
2 голосов
/ 17 февраля 2011

Может быть просто опечатка в вашем демонстрационном коде, но 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;
}
0 голосов
/ 17 февраля 2011

Итак, здесь вы повторяете $ this-> a:

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

Но вот $ this-> голосов:

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

Опечатка или что ...

0 голосов
/ 17 февраля 2011

Проблема в том, что вы пытаетесь сравнить строку с int, не пытаясь преобразовать ее.Измените $a['Amount'] на (int)$a['Amount'] и посмотрите, что произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...