【问题标题】:SimpleXML - Group By Element Attribute valueSimpleXML - 按元素属性值分组
【发布时间】:2016-01-02 13:56:01
【问题描述】:

我又卡住了 我正在尝试根据属性“名称”值对 xml 数据进行分组

XML 提要返回数据

 <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 属性“名称”值对所有数据进行分组 例如法国,英国(这个值是动态的,所以不能添加固定的字符串值)

我真的在为此苦苦挣扎。已经尝试过其他示例,但它们仅在要分组的数据位于节点内时才有效,例如&lt;node&gt;DATA&lt;/node&gt;

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

** 编辑 **

我已经尝试了 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 属性“名称”的相关值) SBType 名称值:例如 France - Coupe de France Ev 名称值:例如 Gazélec Fco Ajaccio v Sainte Marienne

然后显示“法国”的所有数据

然后是类别的所有数据:英国 等等

** 第二次编辑** 这是显示所有数据的 XML 提要 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->attributes()->{'name'}的值来分组

【问题讨论】:

  • 你能分享一个你试过的例子吗?你能举一个预期的分组数据结构的例子吗?
  • 您的代码似乎正确:eval.in/496340。没有结果,因为在您的xpath-表达式中,您选择“英国”,因为在您的 XML 中,name 属性是“英国”。
  • 不,我复制了 xml 提要并缩短了我在上面的 xml 代码中错误地键入 UK 的数据

标签: php xml attributes simplexml grouping


【解决方案1】:

您可以做的是循环 $xml-&gt;Sport-&gt;SBClass 节点并检查 name 属性是否存在。

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

现在您已经有了分组数据,您可以循环这个$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>";
            }
        }
    }
}

【讨论】:

  • 非常感谢,如果您不介意,还可以完美显示 1 个问题如何在
  • 您可以使用 foreach 循环中的值来动态创建和填充 select 元素。
  • 也许这样的设置就是你的意思? foreach ($sbClassGroups as $sbClassGroup) { foreach( $sbClassGroup as $sbClass) { echo "&lt;br&gt;&lt;b&gt;" . $sbClass-&gt;attributes()-&gt;name . "&lt;/b&gt;&lt;br&gt;"; foreach ($sbClass-&gt;SBType as $sbt) { echo sprintf('&lt;br&gt;%1$s&lt;br&gt;&lt;select name="%1$s"&gt;', (string)$sbt-&gt;attributes()-&gt;name); foreach ($sbt-&gt;Ev as $ev) { echo sprintf('&lt;option value="%1$s"&gt;%1$s&lt;/option&gt;', (string)$ev-&gt;attributes()-&gt;name); } echo "&lt;/select&gt;&lt;br&gt;&lt;br&gt;"; } } }
  • 太棒了!!有没有办法可以限制为 foreach ($sbt->Ev as $ev) { 返回的结果数量
猜你喜欢
  • 2018-04-18
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多