Php 通过foreach显示XML数组中的特定值
demo.xmlPhp 通过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/>"; } } } 现在更新了我的问题,我只想在游戏日
$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,您可以针对新问题提出新问题