2009-07-30 6 views
2

Хорошо, вот моя дилемма. Я ищу способ консолидировать данные в группе, используя SimpleXML в PHP. Вот что я имею в виду.PHP SimpleXML Group По типу элемента

Допустим, у меня есть XML, который выглядит следующим образом:

<favorites> 
    <interesting> 
     <type>Movie</type> 
     <character>James Bond</character> 
     <name>Casino Royale</name> 
    </interesting> 
    <interesting> 
     <type>Movie</type> 
     <character>Jason Bourne</character> 
     <name>Bourne Identity</name> 
    </interesting> 
    <interesting> 
     <type>Book</type> 
     <character>Lindsay Ford</character> 
     <name>Shantaram</name> 
    </interesting> 
    </favorites> 

Теперь вот что я хочу, чтобы выглядеть следующим образом:

фильм

  • Казино Рояль - Джеймс Бонд Bourne
  • Bourne Identity - Jason Bourne

Книга

  • Shantaram - Линдсей Форд

Пожалуйста, помогите мне !! Дайте мне знать, если что-то сбивает с толку.

+0

Thanks Mark. Я забыл упомянуть, что существует огромный список «типов», и я не хочу писать xpath для каждого из них, есть ли способ автоматически найти «типы» вместо жесткого кодирования значений (например, «Movie», Книга")? – jchimpo

+0

$ arrTypes = $ xml-> xpath ('interesting/type'); даст вам все типы. К сожалению, это будет массив объектов simplexml. Вам нужно будет перевернуть его и поместить все типы в новый массив, а затем array_unique() новый массив. – Mark

+0

Можете ли вы помочь мне в этом немного больше? Я n00b. :(Спасибо человеку! – jchimpo

ответ

4

Если вы не знаете, в заранее типы фильмов, вы можете:

  • экстракт всех типов из данных XML
    • получить их как уникальные, поскольку они могут появляться несколько раз (возможно, есть способ сделать это с XPath; Я не знаю, поэтому я буду использовать array_unique)
  • повторить эти типы, используя то, что @Mark proposed.


Нечто подобное, вероятно, сделать:

$xml = simplexml_load_string($xmlData); 

$typesListXml = $xml->xpath('interesting/type'); 
var_dump($typesListXml); // var_dump #1 

if (!empty($typesListXml)) { 
    $typesList = array(); 
    foreach ($typesListXml as $typeXml) { 
     $typesList[] = (string)$typeXml; 
    } 
    var_dump($typesList); // var_dump #2 

    $typesList = array_unique($typesList); 
    var_dump($typesList); // var_dump #3 

    $moviesForType = array(); 
    foreach ($typesList as $type) { 
     $rawData = $xml->xpath('interesting[type="' . $type . '"]'); 
     if (!empty($rawData)) { 
      foreach ($rawData as $rawMovie) { 
       $moviesForType[$type][] = $rawMovie->name . ' - ' . $rawMovie->character; 
      } 
     } 
    } 

    var_dump($moviesForType); // var_dump #4 

    // Up to you to present $moviesForType the way you want ;-) 

} 


И, чтобы сделать вещи легче понять, вот выходы var_dump в:

var_dump # 1:

array 
    0 => 
    object(SimpleXMLElement)[2] 
     string 'Movie' (length=5) 
    1 => 
    object(SimpleXMLElement)[3] 
     string 'Movie' (length=5) 
    2 => 
    object(SimpleXMLElement)[4] 
     string 'Book' (length=4) 

var_dump # 2:

array 
    0 => string 'Movie' (length=5) 
    1 => string 'Movie' (length=5) 
    2 => string 'Book' (length=4) 

var_dump # 3:

array 
    0 => string 'Movie' (length=5) 
    2 => string 'Book' (length=4) 

var_dump # 3:

array 
    'Movie' => 
    array 
     0 => string 'Casino Royale - James Bond' (length=26) 
     1 => string 'Bourne Identity - Jason Bourne' (length=30) 
    'Book' => 
    array 
     0 => string 'Shantaram - Lindsay Ford' (length=24) 


Теперь это до вас присутствовать se данные так, как вы хотите; двухстрочное контурное построение <ul> и <li> теги, вероятно, будут делать ;-)

+0

Спасибо, сэр! Ты мужчина! – jchimpo

+0

Добро пожаловать! –

1

Я считаю, что вы ищете Xpath:

$xmlData = '<favorites>...</favorites>'; 
$xml = simplexml_load_string($xmlData); 
$arrMovies = $xml->xpath('interesting[type="Movie"]'); 
$arrBooks = $xml->xpath('interesting[type="Book"]'); 

Вы можете затем цикл более $ arrMovies и $ arrBooks и распечатать то, что вам нужно:

foreach($arrMovies as $movie) { 
    echo $movie->name; 
} 
+0

Спасибо за вашу помощь! – jchimpo

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

  • Нет связанных вопросов^_^