需要创建逻辑来读取xml

时间:2014-01-07 06:04:28

标签: php xml

我有餐馆菜单的xml。

<RestuarantMenu>
<Day name="Monday">
    <options startTime="10:00">This is first link monday</options>
    <options startTime="14:00">This is second link monday</options>
    <options startTime="20:00">This is third link monday</options>
</Day>

<Day name="Tuesday">
    <options startTime="10:00">This is first link</options>
    <options startTime="14:00">This is second link</options>
    <options startTime="20:00">This is third link</options>
</Day>
 <RestuarantMenu>

现在我希望如果当天是星期一,时间在10:00到14:00之间,那么应该是“这是星期一的第一个链接”(第一个选项)。同样,如果当前时间比20:00和低于10:00更大,则应显示last option。 (晚餐菜单到明天早上10点)。

这是我的PHP代码。

echo $t=date('d-m-Y H:i:s'); echo '<br>';
echo $day = date("D",strtotime($t)); echo '<br>';
echo $time = date("H:i",strtotime($t)); echo '<br>';

$xml=simplexml_load_file("menu.xml");

foreach($xml->Day as $Day)
{
   if($Day->attributes() == 'Monday')
   {
    foreach($Day->options as $options)
    {
        if($options->attributes() < $time)
        {
            echo $options; echo '<br>';
        }

     }
    }
  }

现在它只是发现选项时间少于当前时间,但不是在等等之间。

现在条件$options->attributes() < $time给了我那个时间小于当前时间的选项。但是如果当前时间是15:00,它会在输出10:00和14:00给我两个选项,但我需要一个14:00。 如果我的问题不明确,请问我。 感谢

1 个答案:

答案 0 :(得分:1)

试试这个:

$xml = simplexml_load_string($x); // assume XML in $x
$day = "Tuesday";
$time="09:50";

// select <option> by $day and $time
$results = $xml->xpath("/*/Day[@name = '$day']/options[translate(@startTime, ':', '') <= translate('$time',':', '')]");

$result = array_pop($results); // get last element
if (is_null($result)) $result = "the restaurant is closed!"; // if $time is smaller than any startTime

echo "$day, $time... $result";

看到它有效:https://eval.in/86906

重要提示: 仅当startTime - 属性按升序排列时,此方法才有效。

xpath - 表达式将选择<option>&lt; = startTime的所有$time并将其存储在array $results中,array_pop()数组中的最后一个元素并使其成为$result。 如果$time是&lt; startTime$result = NULL

将时间值作为数字进行比较,translate - 函数将12:00更改为120014:23更改为1423,因此{{1 }}&LT; 1200 = 1423