неожиданный приведение в boolean?

Учитывая этот ввод: http://example.com/item.php?room=248&supply_id=18823 , следующие 2 блока должны дать тот же результат. Почему бы и нет? Что я пропущу, кроме кофе?

Этот блок дает ожидаемые значения:

if (isset($_GET['supply_id']) && isset($_GET['room'])) { $id=validkey($_GET['supply_id']); //18823 $room=validkey($_GET['room']); //248 $arr=array('s'=>$id,'r'=>$room); //s=>18823, r=>248 } 

Но если я сделаю чек и задание за один шаг, $ id окажется равным 1 вместо 18823. Почему?

 if (isset($_GET['supply_id']) && isset($_GET['room'])) { if($id=validkey($_GET['supply_id']) && $room=validkey($_GET['room'])) $arr=array('s'=>$id",'r'=>$room); //s=>1, r=>248 } 

Это функция, которую я использую:

 function validkey($value){ if(is_scalar($value)){ $value=(int)$value; return ($value>0) ? $value : false; } return false; } 

Вы должны использовать круглые скобки:

 if(($id=validkey($_GET['supply_id'])) && ($room=validkey($_GET['room']))) 

В противном случае результат validkey($_GET['supply_id']) && $room=validkey($_GET['room']) присваивается переменной $id потому что оператор && имеет более высокий приоритет, чем =

Оператор && связывается сильнее, чем оператор = .

Таким образом, ваш код в основном будет, if ($id = (validkey($_GET['supply_id']) && $room = validkey($_GET['room'])))

-> Добавить круглые скобки вокруг выражений $foo = $bar в вашем выражении IF.

У вас, кажется, небольшая ошибка во втором примере – бродячая двойная цитата после $ id. Кроме того, ваш второй подход, как правило, не одобряется (присваивание переменных в конструкции if), поскольку он значительно затрудняет выполнение кода. Яснее будет следующее:

 if (isset($_GET['supply_id']) && isset($_GET['room'])) { $id=validkey($_GET['supply_id']); //18823 $room=validkey($_GET['room']); //248 if($id && $room) { $arr=array('s'=>$id,'r'=>$room); //s=>18823, r=>248 } }