0

如果我有声明:

$a = 1;
$b = 2;
$c = 3;
if($a == 1 && $b == 2 && $c == 3)
{
  echo 'correct';
}
else
{
  echo 'what variable's weren't matched';
}

有没有办法知道什么没有看而不是单独写所有东西?

干杯!

4

4 回答 4

2

不,您的表达式已转换为布尔值,因此除了再次检查相等性之外,您无法找出触发“假”的原因。

于 2012-04-05T18:37:39.933 回答
2

您需要单独测试每个,但您可以执行以下操作:

$a = 1;
$b = 2;
$c = 3;

$a_matched = $a == 1;
$b_matched = $b == 1;
$c_matched = $c == 1;

if($a_matched && $b_matched && $c_matched)
{
  echo 'correct';
}
else
{
  if (!$a_matched) echo 'a did not match!';
  if (!$b_matched) echo 'b did not match!';
  if (!$c_matched) echo 'c did not match!';
}

但这还不够清楚:

$a = 1;
$b = 2;
$c = 3;

if($a == 1 && $b == 2 && $c == 3)
{
  echo 'correct';
}
else
{
  if (!$a == 1) echo 'a did not match!';
  if (!$b == 2) echo 'c did not match!';
  if (!$c == 3) echo 'b did not match!';
}
于 2012-04-05T18:39:32.000 回答
2

其实,呵呵,我收回我的评论。您可以依靠布尔短路来设置一个变量,该变量指示条件的最后一部分为真:

if (($x = 'a') && $a == 1 && ($x = 'b') && $b == 2 && ($x = 'c') && $c == 3) {
  echo "correct\n";
} else {
  echo "$x is wrong\n";
}

请注意,我永远不会在生产代码中编写它,因为它很愚蠢并且很难理解应该发生的事情。但至少玩起来很有趣。

于 2012-04-05T18:47:24.900 回答
0

没有!那是不可能的。不过,您可以使用数组让生活变得更简单:

$results  = array(1, 2, 4);
$expected = array(1, 2, 3);
$count    = count($results);
$wrong    = array();

for($i = 0; $i < $count; $i++) {
    if($results[$i] !== $expected[$i]) {
        $wrong[] = $i;
    }
}

if(count($wrong) > 0) {
    echo "There were wrong ones. They were at positions: " . implode(', ', $wrong);
} else {
    echo "All good!";
}

例如。

于 2012-04-05T18:40:09.137 回答