2016-01-02 4 views
0

хорошо я застрял снова Я пытаюсь данных XML группы на основе «имя» значение атрибутаSimpleXML - Группировка элементов Значение атрибута

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 например Франция, Великобритания (это значение является динамическим btw, поэтому невозможно добавить фиксированные значения строки)

Am действительно борется с этим. попробовали другие примеры, но они работают только тогда, когда данные в группе находится внутри узла, например <node>DATA</node>

Надежда кто-то может помочь с этим

** Редактировать **

Я попытался большинство из группировки предложения, которые здесь, на SO

$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 Значение имени: например, во Франции - Купе де Франс Ev имя значение: например Gazélec Fco Аяччо v Sainte Marienne

Затем отобразить все данные для "Франция"

Затем все данные по категориям: UKи т.д.

** 2ND EDIT ** Вот исходный 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-> атрибуты() -> { 'имя'}

+0

Можете ли вы поделиться примером, который вы пробовали? Можете ли вы привести пример ожидаемой группированной структуры данных? –

+0

Ваш код кажется правильным: https://eval.in/496340. Нет результата, потому что в вашем выражении 'xpath' вы выбираете« Великобритания », как в вашем XML атрибут' name' - это «Великобритания». – michi

+0

Нет, я скопировал xml feed и сократил данные, которые я набрал, что Великобритания в коде xml выше по ошибке –

ответ

0

Что вы можете сделать, это установить узлы $xml->Sport->SBClass и проверить, существует ли атрибут имени.

Если имя атрибут существует, то вы можете добавить элемент в массив (например, $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>"; 
      } 
     } 
    } 
} 
+0

блестящее спасибо, отлично отображающее Еще один вопрос, если вы не против Как я могу отображать каждую группу и записи под каждым в ', (string) $ sbt-> attributes() -> имя); foreach ($ sbt-> Ev as $ ev) { echo sprintf ('<значение опции = "% 1 $ s">% 1 $ s', (строка) $ ev-> attributes() -> name); } эхо "

"; }} } ' –

Смежные вопросы