【问题标题】:Using if statement to check if numbers exist in xml file?使用if语句检查xml文件中是否存在数字?
【发布时间】:2016-08-11 11:23:46
【问题描述】:

我有一个用户输入 6 个数字的表单,然后我使用 SimpleXML 将输入的数字与 xml 元素进行比较。如果找到正确的数字,则将其存储在变量($n1 - $n6)中。这些变量在 foreach 循环之外用于确定是否所有 6 个数字都正确,然后回显元素的日期和累积奖金。这可以正常工作。

如果输入的数字与 xml 元素不匹配,我想回显一个不正确的结果(“抱歉”)。但是,这部分不起作用,因为它仍然回显日期和累积奖金,它没有链接 xml 中的数字。它会产生一个随机的日期和头奖号码,它们不会存储在 xml 文件中。

我如何确保输入 6 个错误数字时结果是错误的并回显“Sorry”?

XML:

<lottery>
<number>
  <date>7.11.2015</date>
  <num1>2</num1>
  <num2>3</num2>
  <num3>34</num3>
  <num4>43</num4>
  <num5>49</num5>
  <num6>50</num6>
  <jackpot>13156375</jackpot>
</number>
<number>
  <date>08.11.2015</date>
  <num1>11</num1>
  <num2>13</num2>
  <num3>18</num3>
  <num4>25</num4>
  <num5>29</num5>
  <num6>47</num6>
  <jackpot>8842605</jackpot>
</number>
</lottery>

PHP:

$n1 = false;//make true once we find 1st num
$n2 = false;//make true once we find 2nd num
$n3 = false;
$n4 = false;
$n5 = false;
$n6 = false;

$xml = simplexml_load_file('lottery2.xml') or die("Error: Cannot create object");
            if (isset($_POST['num1']) && isset($_POST['num2'])) {

            foreach ($xml->children() as $record) {
                $n1 = $n1 || $record -> num1 == $num1 || $record -> num2 == $num1 || $record -> num3 == $num1 || $record -> num4 == $num1 || $record -> num5 == $num1 || $record -> num6 == $num1;
                $n2 = $n2 || $record -> num1 == $num2 || $record -> num2 == $num2 || $record -> num3 == $num2 || $record -> num4 == $num2 || $record -> num5 == $num2 || $record -> num6 == $num2;
                $n3 = $n3 || $record -> num1 == $num3 || $record -> num2 == $num3 || $record -> num3 == $num3 || $record -> num4 == $num3 || $record -> num5 == $num3 || $record -> num6 == $num3;
                $n4 = $n4 || $record -> num1 == $num4 || $record -> num2 == $num4 || $record -> num3 == $num4 || $record -> num4 == $num4 || $record -> num5 == $num4 || $record -> num6 == $num4;
                $n5 = $n5 || $record -> num1 == $num5 || $record -> num2 == $num5 || $record -> num3 == $num5 || $record -> num4 == $num5 || $record -> num5 == $num5 || $record -> num6 == $num5;
                $n6 = $n6 || $record -> num1 == $num6 || $record -> num2 == $num6 || $record -> num3 == $num6 || $record -> num4 == $num6 || $record -> num5 == $num6 || $record -> num6 == $num6;

                    if ($n1 && $n2 && $n3 && $n4 && $n5 && $n6) break; //Found match. No need to keep looking

                }//end foreach

                if ($n1 && $n2 && $n3 && $n4 && $n5 && $n6) 
                {
                 echo $record -> date;
                 echo $record -> jackpot;
                }
                else
                {
                 echo "Sorry no winnings";
                }

【问题讨论】:

  • 你的条件有点乱。让我们看看会发生什么$n1 || $record -&gt; num1 == $num1 将转换为false || 1 == 2(例如),它工作正常,直到$n1true,然后true || 1 == 1,这总是正确的,因为这是一个短路。

标签: php xml foreach


【解决方案1】:

如果您认为应该考虑使用数组而不是庞大的 if 语句。

我会这样做:

  • 建立球员号码列表并排序
  • 对于 XML 文件中的每个条目:
    • 建立彩票号码列表并对其进行排序
    • 使用排序后的数组将玩家号码与彩票号码进行比较

示例代码:

$xml = simplexml_load_file('lottery2.xml') or die("Error: Cannot create object");

if(isset($_POST['num1']) && isset($_POST['num2'])) {
  $myList = array($num1, $num2, $num3, $num4, $num5, $num6);
  $result = array();
  $win = 0;

  sort($myList);

  foreach ($xml->children() as $record) {
    for($n = 0; $n < 6; $n++) {
      $result[$n] = (int)$record -> {'num'.($n + 1)};
    }
    sort($result);

    if (match($myList, $result)) {
      echo $record -> date;
      echo $record -> jackpot;
      $win++;
    }
  }
  if($win == 0) {
    echo "Sorry no winnings";
  }
}

function match ($list1, $list2) {
  for($n = 0; $n < 6; $n++) {
    if($list1[$n] != $list2[$n]) {
      return false;
    }
  }
  return true;
}

【讨论】:

  • 效果很好。只是想知道是否有一种方法可以在 foreach 循环之外执行 if 语句,因为对于每个不匹配的号码集以及正确号码匹配的日期和累积奖金都会显示“抱歉没有中奖”。我试过休息;但是在 xml 文件中只找到第一个集合后就会中断循环,因此第一个之后的任何数字即使正确也会显示不正确
  • @A.Hollingsworth - 例如,您可以通过添加$win 计数器并在循环后$win == 0 显示“抱歉没有中奖”消息来做到这一点。 (我已经相应地更新了我的答案。)
猜你喜欢
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
相关资源
最近更新 更多