Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过foreach显示XML数组中的特定值_Php_Xml_Multidimensional Array - Fatal编程技术网

Php 通过foreach显示XML数组中的特定值

Php 通过foreach显示XML数组中的特定值,php,xml,multidimensional-array,Php,Xml,Multidimensional Array,demo.xml $xml = simplexml_load_file('demo.xml'); foreach($xml->Game as $d) { foreach( $d->SportsBook as $sb) { foreach( $sb->Odds as $odds) { // echo $odds['LineType'].' '.$odds['LastUpdated']."<br/>"; } } } 现在更新了我的问题,我只想在游戏日

demo.xml

$xml = simplexml_load_file('demo.xml');

foreach($xml->Game as $d) {

foreach( $d->SportsBook as $sb) {

foreach( $sb->Odds as $odds) {
  //   echo $odds['LineType'].' '.$odds['LastUpdated']."<br/>";

}
} 
}
现在更新了我的问题,我只想在游戏日期为2017年8月25日的情况下获取,加上仅获取2场游戏。 如何在每场比赛中显示特定的赔率值。类似于3倍的值。游戏值,每个游戏的值仅为3倍。 结果是这样的

时间:下午1:45 线型:3 最近更新:20

时间:下午1:45 线型:3 最近更新:20


提前感谢。

您可以使用XPath查找感兴趣的部分,而不是尝试浏览XML的各个层

<?xml version="1.0" encoding="utf-8"?>
<GameOdds SportsCode="MLB">
<Game Code="121" Date="08/25/2017" Time="1:45 PM" HomeBoardNumber="11"     
Home="home" RoadBoardNumber="951" Road="Road" Note=""> <SportsBook ID="5"     
Name="5Dimes">
<Odds LineType="2"  LastUpdated="10"  />
</SportsBook>
<SportsBook ID="5" Name="3Dimes">
<Odds LineType="3"  LastUpdated="20"  />
</SportsBook> </Game>
<Game Code="122" Date="07/02/2017" Time="1:45 PM" HomeBoardNumber="11" 
Home="home" RoadBoardNumber="931" Road="Road" Note="">
<SportsBook ID="2" Name="5Dimes">
<Odds LineType="2"  LastUpdated="10"  />
</SportsBook>
<SportsBook ID="6" Name="3Dimes">
<Odds LineType="3"  LastUpdated="30"  />
</SportsBook> 
</Game>
<Game Code="121" Date="08/25/2017" Time="1:45 PM" HomeBoardNumber="11"     
Home="home" RoadBoardNumber="951" Road="Road" Note=""> <SportsBook ID="5"     
Name="5Dimes">
<Odds LineType="2"  LastUpdated="10"  />
</SportsBook>
<SportsBook ID="5" Name="3Dimes">
<Odds LineType="3"  LastUpdated="30"  />
</SportsBook> </Game>
<Game Code="121" Date="08/31/2017" Time="1:45 PM" HomeBoardNumber="11"     
Home="home" RoadBoardNumber="951" Road="Road" Note=""> <SportsBook ID="5"     
Name="5Dimes">
<Odds LineType="2"  LastUpdated="10"  />
</SportsBook>
<SportsBook ID="5" Name="3Dimes">
<Odds LineType="3"  LastUpdated="20"  />
</SportsBook> </Game>
<Game Code="121" Date="08/25/2017" Time="1:45 PM" HomeBoardNumber="11"     
Home="home" RoadBoardNumber="951" Road="Road" Note=""> <SportsBook ID="5"     
Name="5Dimes">
<Odds LineType="2"  LastUpdated="10"  />
</SportsBook>
<SportsBook ID="5" Name="3Dimes">
<Odds LineType="3"  LastUpdated="20"  />
</SportsBook> </Game>
</GameOdds>

这种方法最困难的是,一旦你找到了“赔率”元素,你就必须使用parent:::*返回以获取时间部分。

而不是尝试浏览XML的各个层,你可以使用XPath来找到你感兴趣的部分

<?xml version="1.0" encoding="utf-8"?>
<GameOdds SportsCode="MLB">
<Game Code="121" Date="08/25/2017" Time="1:45 PM" HomeBoardNumber="11"     
Home="home" RoadBoardNumber="951" Road="Road" Note=""> <SportsBook ID="5"     
Name="5Dimes">
<Odds LineType="2"  LastUpdated="10"  />
</SportsBook>
<SportsBook ID="5" Name="3Dimes">
<Odds LineType="3"  LastUpdated="20"  />
</SportsBook> </Game>
<Game Code="122" Date="07/02/2017" Time="1:45 PM" HomeBoardNumber="11" 
Home="home" RoadBoardNumber="931" Road="Road" Note="">
<SportsBook ID="2" Name="5Dimes">
<Odds LineType="2"  LastUpdated="10"  />
</SportsBook>
<SportsBook ID="6" Name="3Dimes">
<Odds LineType="3"  LastUpdated="30"  />
</SportsBook> 
</Game>
<Game Code="121" Date="08/25/2017" Time="1:45 PM" HomeBoardNumber="11"     
Home="home" RoadBoardNumber="951" Road="Road" Note=""> <SportsBook ID="5"     
Name="5Dimes">
<Odds LineType="2"  LastUpdated="10"  />
</SportsBook>
<SportsBook ID="5" Name="3Dimes">
<Odds LineType="3"  LastUpdated="30"  />
</SportsBook> </Game>
<Game Code="121" Date="08/31/2017" Time="1:45 PM" HomeBoardNumber="11"     
Home="home" RoadBoardNumber="951" Road="Road" Note=""> <SportsBook ID="5"     
Name="5Dimes">
<Odds LineType="2"  LastUpdated="10"  />
</SportsBook>
<SportsBook ID="5" Name="3Dimes">
<Odds LineType="3"  LastUpdated="20"  />
</SportsBook> </Game>
<Game Code="121" Date="08/25/2017" Time="1:45 PM" HomeBoardNumber="11"     
Home="home" RoadBoardNumber="951" Road="Road" Note=""> <SportsBook ID="5"     
Name="5Dimes">
<Odds LineType="2"  LastUpdated="10"  />
</SportsBook>
<SportsBook ID="5" Name="3Dimes">
<Odds LineType="3"  LastUpdated="20"  />
</SportsBook> </Game>
</GameOdds>
这种方法最困难的一点是,一旦你进入“赔率”元素,你就必须使用parent:::*返回以获取时间部分。

使用函数的解决方案:

$xml = simplexml_load_file('t1.xml');

$xpath = $xml->xpath('//SportsBook[@Name="3Dimes"]/Odds');

foreach ($xpath as $odds)   {
    echo 'Time:'.(string)$odds->xpath('parent::*/parent::*/@Time')[0]
            .' LineType:'. $odds["LineType"]
            .' LastUpdated:'.$odds["LastUpdated"]."\n";
}
输出:

$xml_data = simplexml_load_file('demo.xml');

foreach ($xml_data->Game as $game) {
    $t = $game['Time'];
    $odds = $game->xpath('SportsBook[@Name="3Dimes"]/Odds');
    echo 'Time: ' . $t . ' LineType: ' . $odds[0]->attributes()['LineType']
          . ' LastUpdated: ' . $odds[0]->attributes()['LastUpdated'] . PHP_EOL;
}
使用函数的解决方案:

$xml = simplexml_load_file('t1.xml');

$xpath = $xml->xpath('//SportsBook[@Name="3Dimes"]/Odds');

foreach ($xpath as $odds)   {
    echo 'Time:'.(string)$odds->xpath('parent::*/parent::*/@Time')[0]
            .' LineType:'. $odds["LineType"]
            .' LastUpdated:'.$odds["LastUpdated"]."\n";
}
输出:

$xml_data = simplexml_load_file('demo.xml');

foreach ($xml_data->Game as $game) {
    $t = $game['Time'];
    $odds = $game->xpath('SportsBook[@Name="3Dimes"]/Odds');
    echo 'Time: ' . $t . ' LineType: ' . $odds[0]->attributes()['LineType']
          . ' LastUpdated: ' . $odds[0]->attributes()['LastUpdated'] . PHP_EOL;
}
请参阅:

请参阅:


Xpath表达式允许您使用路径和条件获取部分DOM。在您的情况下,您希望输出带有特定属性的SportsBook元素中的赔率。这在Xpath中相当简单

获取任何SportsBook元素节点 //运动手册 使用特定的名称属性值 //SportsBook[@Name=3次] 获取它们的子节点 //SportsBook[@Name=3次]/赔率 如果使用DOM,则返回一个DOMNodelist;如果使用SimpleXML,则返回一个数组。时间属性不在赔率节点上,而是在祖先节点上。所以我们用这个轴

获取游戏祖先节点 //祖先:游戏 它们的时间属性 祖先::游戏/@时间 将第一个最接近的大小写转换为字符串 StringAn祖::游戏/@时间 转换为字符串的最后一步仅适用于DOMXpath::evaluate。这是一个完整的DOM示例,其他答案已经显示了SimpleXML逻辑

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

$expression = '//SportsBook[@Name="3Dimes"]/Odds';
foreach ($xpath->evaluate($expression) as $odds) {
  printf(
    "Time:%s LineType:%d LastUpdated:%d\n",
    $xpath->evaluate('string(ancestor::Game/@Time)', $odds),
    $odds->getAttribute('LineType'),
    $odds->getAttribute('LastUpdated')
  );
}
输出:

Time:1:45 PM LineType:3 LastUpdated:20
Time:1:45 PM LineType:3 LastUpdated:30

Xpath表达式允许您使用路径和条件获取部分DOM。在您的情况下,您希望输出带有特定属性的SportsBook元素中的赔率。这在Xpath中相当简单

获取任何SportsBook元素节点 //运动手册 使用特定的名称属性值 //SportsBook[@Name=3次] 获取它们的子节点 //SportsBook[@Name=3次]/赔率 如果使用DOM,则返回一个DOMNodelist;如果使用SimpleXML,则返回一个数组。时间属性不在赔率节点上,而是在祖先节点上。所以我们用这个轴

获取游戏祖先节点 //祖先:游戏 它们的时间属性 祖先::游戏/@时间 将第一个最接近的大小写转换为字符串 StringAn祖::游戏/@时间 转换为字符串的最后一步仅适用于DOMXpath::evaluate。这是一个完整的DOM示例,其他答案已经显示了SimpleXML逻辑

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

$expression = '//SportsBook[@Name="3Dimes"]/Odds';
foreach ($xpath->evaluate($expression) as $odds) {
  printf(
    "Time:%s LineType:%d LastUpdated:%d\n",
    $xpath->evaluate('string(ancestor::Game/@Time)', $odds),
    $odds->getAttribute('LineType'),
    $odds->getAttribute('LastUpdated')
  );
}
输出:

Time:1:45 PM LineType:3 LastUpdated:20
Time:1:45 PM LineType:3 LastUpdated:30

感谢您的帮助,但现在如果日期=2017年8月25日,我想获取价值@romanperekhrest@Asher,您可以为新问题提出一个新问题,请提供帮助,但现在,如果日期=2017年8月25日,我希望获取值@romanperekhrest@Asher,您可以针对新问题提出新问题