Я давно использовал назначение в операторах long if для упрощения. Но в этом случае он не работает должным образом. Вот что я получил:Если оператор дает неправильный ответ
$Employee = GetEmployeeName($Record['employee_id']);
echo 'First name: '.$Employee['first_name'];
echo 'Last name: '.$Employee['last_name'];
echo 'Record first name: '.$Record['first_name'];
echo 'Record last name: '.$Record['last_name'];
echo 'Comparing first name: ';
var_dump(strcasecmp($Employee['first_name'], $Record['first_name']));
echo 'Comparing last name: ';
var_dump(strcasecmp($Employee['last_name'], $Record['last_name']));
echo 'Comparing both together: ';
var_dump(strcasecmp($Employee['first_name'], $Record['first_name'])
|| strcasecmp($Employee['last_name'], $Record['last_name']));
echo 'All together now: ';
var_dump($Foo = GetEmployeeName($Record['employee_id'])
&& (strcasecmp($Foo['first_name'], $Record['first_name'])
|| strcasecmp($Foo['last_name'], $Record['last_name'])));
Вот результаты:
First name: ZACHARY
Last name: TAYLOR
Record first name: Zachary
Record last name: Taylor
Comparing first name: int(0)
Comparing last name: int(0)
Comparing both together: bool(false)
All together now: bool(true)
Это не имеет никакого смысла. Сравнение первого имени разрешается как 0 (false); сравнение последнего имени разрешается как 0 (false); сравнивая их вместе, разрешается как ложное. Однако, когда я добавляю назначение в if, он внезапно решается как истинный. Я назначал переменные в ifs в течение длительного времени, и я никогда не видел, чтобы это произошло. Странно, если я назначаю вне if, то он отлично работает. Поэтому я мог бы это сделать, но на данный момент речь идет о принципе выяснения того, что происходит не так, поэтому я могу улучшить свои знания языка.
Присвоение в этом случае дает истину, как вы можете видеть из-за того, что заполняется $ Employee. Итак, окончательный var_dump
по существу является «true & & false», который должен быть разрешен как false. Правильно?
Нет, окончательный 'var_dump()' демпинг значение 'только $ Foo'. – BoltClock
Я подозреваю, что здесь есть проблемы с выбором типа. Помните, что strcasecmp() не возвращает bool, а int. То, что вы должны попробовать, это нечто вроде '(strcasecmp ($ Employee ['first_name'], $ Record ['first_name']) == 0)', так что вы преобразовываете вывод strcasecmp() в значение bool, соответствующее дальнейшее сравнение позже. – Brad
Я знаю, что он возвращает int, но когда они равны, он возвращает 0, который разрешает false. :) – Andrew