SimpleXML - 按元素属性值组

时间:2016-01-02 13:56:02

标签: php xml attributes simplexml grouping

好吧我再次陷入困境 我试图根据属性'name'值

对xml数据进行分组

XML Feed返回数据

 <Sport sport_code="FOOT" name="Football" disporder="-1000">
<SBClass sb_class_id="12430" disporder="-999" name="France">
<SBType sb_type_id="26463" name="France - Coupe de France" disporder="52">
<Ev inplay_allowed="Y" status="A" name="Gazélec Fco Ajaccio v Sainte Marienne" start_time="2016-01-02T12:30:00" virtual="N" ev_timezone="Europe/London" inplay_now="Y" mkt_count="37" ev_id="3400770" disporder="-9996">
<EvDetail br_match_id="8548770"/>
<Inplay inplay_period_num="1" clock_status="TICKING" correct_at="2016-01-02T12:50:11" inplay_period="first_half" score_string="0-0" last_change="2016-01-01T09:45:07" inplay_secs="1209"/>
<Teams>
<Team team_id="3411" team_order="0" name="Gazélec Fco Ajaccio" short_name="Gazélec Fco Ajaccio"/>
<Team team_id="172231" team_order="1" name="Sainte Marienne" short_name="Sainte Marienne"/>
</Teams>
</Ev>
</SBType>
</SBClass>

<SBClass sb_class_id="12430" disporder="-999" name="UK">
<SBType sb_type_id="26463" name="France - Coupe de France" disporder="52">
<Ev inplay_allowed="Y" status="A" name="Gazélec Fco Ajaccio v Sainte Marienne" start_time="2016-01-02T12:30:00" virtual="N" ev_timezone="Europe/London" inplay_now="Y" mkt_count="37" ev_id="3400770" disporder="-9996">
<EvDetail br_match_id="8548770"/>
<Inplay inplay_period_num="1" clock_status="TICKING" correct_at="2016-01-02T12:50:11" inplay_period="first_half" score_string="0-0" last_change="2016-01-01T09:45:07" inplay_secs="1209"/>
<Teams>
<Team team_id="3411" team_order="0" name="Gazélec Fco Ajaccio" short_name="Gazélec Fco Ajaccio"/>
<Team team_id="172231" team_order="1" name="Sainte Marienne" short_name="Sainte Marienne"/>
</Teams>
</Ev>
</SBType>
</SBClass>
</Sport>

我希望它根据SBClass属性'name'值对所有数据进行分组 例如法国,英国(这个值是动态btw所以不能添加固定的字符串值)

我真的很挣扎。尝试了其他示例,但只有当分组的数据位于节点内时才会起作用,例如<node>DATA</node>

希望有人可以帮助解决这个问题

**编辑**

我已经尝试了S.O。

上的大多数分组建议
    $xmlData = 'http://feeds-sports.winner.com/odds_feed?key=get_events_for_sport&sport_code=FOOT&on_date=2016-01-02';
$xml = simplexml_load_file($xmlData);

$leagues = $xml->xpath('/Sport/SBClass[@name="United Kingdom"]');
var_dump($leagues);    // var_dump #1

它根本没有任何倾销

我想让它显示这样的数据 类别:法国(或来自SBClass属性'name'的相关值) SBType名称值:例如法国 - Coupe de France Ev名称价值:例如GazélecFcoAjaccio v Sainte Marienne

然后显示“France”的所有数据

然后所有数据分类:英国 等

** 2ND编辑** 以下是显示所有数据的XML Feed http://feeds-sports.winner.com/odds_feed?key=get_match_markets_for_sport&lang=en&sb_class_id=12430&sport_code=FOOT&mkt_sort=MRES

我想按SBType-&gt; attributes() - &gt; {'name'}

的值对其进行分组

1 个答案:

答案 0 :(得分:0)

您可以做的是循环$xml->Sport->SBClass个节点并检查名称属性是否存在。

如果name属性存在,您可以将该项添加到数组(例如$sbClassGroups)并使用name属性为该组创建数组键(法国,西班牙等)。

现在您已拥有分组数据,您可以使用例如$sbClassGroups构造来循环此foreach数组,以从SimpleXMLElement类型的元素中获取值。

$xmlData = 'http://feeds-sports.winner.com/odds_feed?key=get_events_for_sport&sport_code=FOOT&on_date=2016-01-02';
$xml = simplexml_load_file($xmlData);

$sbClassGroups = array();

foreach ($xml->Sport->SBClass as $item) {
    if (isset($item->attributes()->name)) {
        $sbClassGroups[(string)$item->attributes()->name][] = $item;
    }
}

foreach ($sbClassGroups as $sbClassGroup) {
    foreach( $sbClassGroup as $sbClass) {
        echo "<br><b>" . $sbClass->attributes()->name . "</b><br>";

        foreach ($sbClass->SBType as $sbt) {
            echo "<br>" . $sbt->attributes()->name . "<br>";

            foreach ($sbt->Ev as $ev) {
                echo "<i>" . $ev->attributes()->name . "</i><br>";
            }
        }
    }
}