首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP / XML -不同的值&嵌套循环

PHP / XML -不同的值&嵌套循环
EN

Stack Overflow用户
提问于 2016-01-07 18:22:15
回答 1查看 84关注 0票数 0

我正在升级一个老的asp影院网站到php。它需要从xml提要中提取其电影计划数据。

这是schedule.xml:

代码语言:javascript
复制
<showtimes>
  <movie>
    <name>BROOKLYN</name>
    <movieId>BR30015</movieId>
    <showtime>
      <date>01082016</date>
      <time>1700</time>
      <soldout>0</soldout>
      <linkref>29779</linkref>
    </showtime>
    <showtime>
      <date>01082016</date>
      <time>1930</time>
      <soldout>0</soldout>
      <linkref>29780</linkref>
    </showtime>
    <showtime>
      <date>01092016</date>
      <time>1700</time>
      <soldout>0</soldout>
      <linkref>29797</linkref>
    </showtime>
    <showtime>
      <date>01092016</date>
      <time>1930</time>
      <soldout>0</soldout>
      <linkref>29796</linkref>
    </showtime>
    <showtime>
      <date>01102016</date>
      <time>1700</time>
      <soldout>0</soldout>
      <linkref>29822</linkref>
    </showtime>
    <showtime>
      <date>01102016</date>
      <time>1930</time>
      <soldout>0</soldout>
      <linkref>29823</linkref>
    </showtime>
  </movie>
  <movie>
    <name>THE HATEFUL EIGHT</name>
    <movieId>HA18700</movieId>
    <showtime>
      <date>01072016</date>
      <time>1630</time>
      <soldout>0</soldout>
      <linkref>29399</linkref>
    </showtime>
    <showtime>
      <date>01072016</date>
      <time>2000</time>
      <soldout>1</soldout>
      <linkref>29400</linkref>
    </showtime>
    <showtime>
      <date>01082016</date>
      <time>1800</time>
      <soldout>0</soldout>
      <linkref>29770</linkref>
    </showtime>
    <showtime>
      <date>01082016</date>
      <time>2130</time>
      <soldout>0</soldout>
      <linkref>29771</linkref>
    </showtime>
    <showtime>
      <date>01082016</date>
      <time>2330</time>
      <soldout>0</soldout>
      <linkref>29799</linkref>
    </showtime>
    <showtime>
      <date>01092016</date>
      <time>1800</time>
      <soldout>0</soldout>
      <linkref>29808</linkref>
    </showtime>
    <showtime>
      <date>01092016</date>
      <time>2130</time>
      <soldout>0</soldout>
      <linkref>29807</linkref>
    </showtime>
  </movie>
</showtimes>

这个想法是,在电影细节页面中将有一个展示时间部分,用户可以点击某个日期/时间,并被直接带到在线预订站点进行显示。

电影是通过movieId标记从xml中提取的。每部电影每天放映3-5次,至少一周。

如果用户选择可恨的八部电影,我需要如下所示的输出:

代码语言:javascript
复制
01072016 - 1630, 2000, 
01082016 - 1800, 2130, 2330
01092016 - 1800, 2130

我一直在寻找一种解决方案,而且我似乎在兜圈子。

任何帮助都将不胜感激。

干杯

尼科

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-07 20:30:38

(这应该能起作用:)

代码语言:javascript
复制
<?php

$xml = "<showtimes>
  <movie>
    <name>BROOKLYN</name>
    <movieId>BR30015</movieId>
    <showtime>
      <date>01082016</date>
      <time>1700</time>
      <soldout>0</soldout>
      <linkref>29779</linkref>
    </showtime>
    <showtime>
      <date>01082016</date>
      <time>1930</time>
      <soldout>0</soldout>
      <linkref>29780</linkref>
    </showtime>
    <showtime>
      <date>01092016</date>
      <time>1700</time>
      <soldout>0</soldout>
      <linkref>29797</linkref>
    </showtime>
    <showtime>
      <date>01092016</date>
      <time>1930</time>
      <soldout>0</soldout>
      <linkref>29796</linkref>
    </showtime>
    <showtime>
      <date>01102016</date>
      <time>1700</time>
      <soldout>0</soldout>
      <linkref>29822</linkref>
    </showtime>
    <showtime>
      <date>01102016</date>
      <time>1930</time>
      <soldout>0</soldout>
      <linkref>29823</linkref>
    </showtime>
  </movie>
  <movie>
    <name>THE HATEFUL EIGHT</name>
    <movieId>HA18700</movieId>
    <showtime>
      <date>01072016</date>
      <time>1630</time>
      <soldout>0</soldout>
      <linkref>29399</linkref>
    </showtime>
    <showtime>
      <date>01072016</date>
      <time>2000</time>
      <soldout>1</soldout>
      <linkref>29400</linkref>
    </showtime>
    <showtime>
      <date>01082016</date>
      <time>1800</time>
      <soldout>0</soldout>
      <linkref>29770</linkref>
    </showtime>
    <showtime>
      <date>01082016</date>
      <time>2130</time>
      <soldout>0</soldout>
      <linkref>29771</linkref>
    </showtime>
    <showtime>
      <date>01082016</date>
      <time>2330</time>
      <soldout>0</soldout>
      <linkref>29799</linkref>
    </showtime>
    <showtime>
      <date>01092016</date>
      <time>1800</time>
      <soldout>0</soldout>
      <linkref>29808</linkref>
    </showtime>
    <showtime>
      <date>01092016</date>
      <time>2130</time>
      <soldout>0</soldout>
      <linkref>29807</linkref>
    </showtime>
  </movie>
</showtimes>";

function getMovieNode($name, $xmlString) {
  $movies = simplexml_load_string($xmlString);
  foreach ($movies as $movie) {
    if ($movie->name == $name) return $movie;
  }
  throw new Exception('Movie not found');
}

function convertNodes($nodes) {
  $times = [];
  foreach ($nodes as $time) {
    array_push($times, $time);
  }
  return $times;
}

function getSchedule($name, $xmlString) {
  $movie = getMovieNode($name, $xmlString);
  return array_reduce(convertNodes($movie->showtime), function($acc, $curr) {
    $acc[reset($curr->date)][] = reset($curr->time);
    return $acc;
  }, []);
}

foreach (getSchedule('THE HATEFUL EIGHT', $xml) as $date => $times) {
  print $date;
  print ' - ';
  $last = array_pop($times);
  foreach ($times as $time) {
    print $time;
    print ', ';
  }
  print $last . "\n";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34662401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档