2017-07-13 1 views
0
$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.xmlEs wird spezifischen Wert von XML-Array durch foreach

<?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> 

jetzt meine Frage aktualisiert ich nur holen will, wenn GAME Date = "2017.08.25" plus nur nur 2 Spiele holen . Wie kann ich in jedem Spiel einen bestimmten Odds-Wert anzeigen? Etwas wie 3Dimes nur Werte. Spielwert und nur 3dimes Werte von jedem Spiel. Ergebnis wird so

Zeit: 1: 45 PM Linetype: 3 Lastupdated: 20

Zeit: 1: 45 PM Linetype: 3 Lastupdated: 20

Danke im Voraus.

Antwort

1

Die Lösung mit SimpleXMLElement::xpath Funktion:

$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; 
} 

Der Ausgang:

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

Danke für die Hilfe, aber jetzt möchte ich Wert holen, wenn Date = „2017.08.25“ @romanperekhrest – Asher

+0

@Asher Sie eine neue Frage für die initiieren könnte Neuausgabe – RomanPerekhrest

+0

https://Stackoverflow.com/q/45875907/6952392 Bitte überprüfen Sie – Asher

1

Anstatt zu versuchen, die Schichten der XML navigieren können Sie XPath verwenden, um die Teile Ihrer interessieren ...

$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"; 
} 

Das Schwierigste, was mit dieser Art und Weise zu finden, ist, dass wenn man einmal nach unten gegangen die 'Odds' Elemente, müssen Sie dann wieder gehen (mit parent::*), um den Zeitteil zu holen.

1

Bitte sehen: https://iconoun.com/demo/temp_asher.php

<?php // demo/temp_asher.php 
 
/** 
 
* Dealing with XML document 
 
* 
 
* https://stackoverflow.com/questions/45083520/showing-specific-value-from-xml-array-through-foreach 
 
*/ 
 
error_reporting(E_ALL); 
 
echo '<pre>'; 
 

 
// TEST DATA FROM THE POST AT STACK 
 
$xml = <<<EOD 
 
<?xml version="1.0" encoding="utf-8"?> 
 
<GameOdds SportsCode="MLB"> 
 
    <Game Code="121" Date="07/06/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> 
 
</GameOdds> 
 
EOD; 
 

 
// MAKE AN OBJECT 
 
$obj = simplexml_load_string($xml); 
 

 
// ACTIVATE THIS TO VISUALIZE THE OBJECT 
 
// var_dump($obj); 
 

 
// EXTRACT DATA FROM THE OBJECT 
 
foreach ($obj->Game as $g) 
 
{ 
 
    $t = (string)$g->attributes()->Time; 
 
    foreach ($g->SportsBook as $s) 
 
    { 
 
     // SKIP ANYTHING THAT IS NOT THE "Name" WE WANT 
 
     $n = (string)$s->attributes()->Name; 
 
     if ($n != '3Dimes') continue; 
 

 
     $o = $s->Odds; 
 
     $olt = (string)$o->attributes()->LineType; 
 
     $olu = (string)$o->attributes()->LastUpdated; 
 

 
     // SHOW THE INFORMATION FROM THE OBJECT 
 
     echo PHP_EOL; 
 
     echo "Time:$t "; 
 
     echo "LineType:$olt "; 
 
     echo "LastUpdated:$olu "; 
 
    } 
 
}

1

Mit Xpath-Ausdrücken können Sie Teile eines DOM mithilfe von Pfaden und Bedingungen abrufen. In Ihrem Fall möchten Sie die Odds in SportsBook Elemente mit einem bestimmten Attribut ausgeben. Das ist ziemlich einfach in Xpath.

  • fetch jeden SportsBook Elementknoten
    //SportsBook
  • mit einem bestimmten Name Attributwert
    //SportsBook[@Name="3Dimes"]
  • die Odds Kindknoten von ihnen diese
    //SportsBook[@Name="3Dimes"]/Odds

fetch wird eine DOMNodeList zurückkehren (Wenn Sie usin sind g DOM) oder ein Array (wenn Sie SimpleXML verwenden). Das Time-Attribut befindet sich nicht auf dem Odds-Knoten, sondern einem Vorgängerknoten. Also benutzen wir diese Achse.

  • Abruf Game Vorfahr-Knoten
    //ancestor::Game
  • ihre Time Attribute
    ancestor::Game/@Time
  • Fall die erste (nächste) in einen String
    string(ancestor::Game/@Time)

Der letzte Schritt (Abgiessen in string) funktioniert nur mit DOMXpath::evaluate(). Hier ist ein vollständiges DOM-Beispiel (Die anderen Antworten zeigen bereits die SimpleXML-Logik).

$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') 
); 
} 

Ausgang:

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