2016-01-27 1 views
2

У меня есть проблема с моей функцией, которая должна объединить логические операторы, по данным в массиве:Логического уравнения операторы в PHP

$arr = array(
    0 => array(false, "or"), 
    1 => array(false, "or"), 
    2 => array(true) 
); 

уравнение должно быть:

  • ложь или ложь или правда
  • ($ обр [0] [0] $ обр [0] [1] $ обр [1] [0] $ обр [1] [1] $ обр [2] [0])

И результат: true

Но что-то не так происходит в функции, и оно возвращает false. Что мне не хватает?

var_dump(arrayBoolValidation($arr)); 

function arrayBoolValidation (array $arr) { 
    $num = count($arr); 
    $status = $arr[0][0]; 
    for($i = 1; $i < $num; ++$i) { 
     if ($arr[$i-1][1] == "and") { 
      $status = filter_var($status, FILTER_VALIDATE_BOOLEAN) and filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN); 
     } else if ($arr[$i-1][1] == "or") { 
      $status = filter_var($status, FILTER_VALIDATE_BOOLEAN) or filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN); 
     } 
    } 
    return $status; 
} 
+0

Mikalkenas: Может быть, вы должны смотреть на это: http://stackoverflow.com/questions/3737139/reference-what -does-this-symbol-mean-in-php – MDChaara

ответ

0

Предполагая, что все условия должны быть оценены:

Примечание: Я добавил случай, когда оператор не определен.

[...] 
    if (!isset($arr[$i-1][1])) { 
     $status = $status || $arr[$i][0]; // default: OR, && else 
    } else if ($arr[$i-1][1] == "and") { 
     $status = $status && $arr[$i][0]; 
    } else if ($arr[$i-1][1] == "or") { 
     $status = $status || $arr[$i][0]; 
    } 
    [...] 
0

Измените следующие внутри цикла:

if ($arr[$i-1][1] == "and") { 
    $status = (filter_var($status, FILTER_VALIDATE_BOOLEAN) and filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN)); 
} else if ($arr[$i-1][1] == "or") { 
    $status = (filter_var($status, FILTER_VALIDATE_BOOLEAN) or filter_var($arr[$i][0], FILTER_VALIDATE_BOOLEAN)); 
} 

Вы увидите дополнительные скобки.

Если вы не ставите их, вы устанавливаете $ status filter_var ($ status, FILTER_VALIDATE_BOOLEAN), который всегда будет таким же, как и первая запись (в данном случае это ложь).

+0

Спасибо! не знал, что = имеет более высокий приоритет, чем и – rokas

2

Это проблема приоритета оператора. and - это не то же самое, что и &&. Посмотрите на http://php.net/manual/en/language.operators.precedence.php

= имеет более высокий приоритет, чем and, так $a = $b and $c; равна $a = $b;.

Вы должны использовать дополнительные кронштейны ($a = ($b and $c);) или лучше использовать &&. То же самое о or (используйте ||).

-1

Я думаю, что есть что-то не так в цикле

попробовать,

for($i = 1; $i <=$num; ++$i) { 

 Смежные вопросы

  • Нет связанных вопросов^_^