مجموعة PHP SimpleXML حسب نوع العنصر
سؤال
طيب هنا معضلتي.أنا أبحث عن طريقة لدمج البيانات في مجموعة باستخدام SimpleXML في PHP.وهنا ما أعنيه.
لنفترض أن لدي ملف 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>
الآن إليك ما أريد أن يبدو عليه:
فيلم
- كازينو رويال - جيمس بوند بورن
- هوية بورن - جيسون بورن
كتاب
- شانتارام - ليندساي فورد
الرجاء مساعدتي!!اسمحوا لي أن أعرف إذا كان هناك أي شيء مربك.
المحلول
إذا كنت لا تعرف مسبقًا أنواع الأفلام، فيمكنك:
- استخراج كافة الأنواع من بيانات XML
- اجعلها فريدة من نوعها، لأنها قد تظهر عدة مرات (قد تكون هناك طريقة للقيام بذلك باستخدام XPath ؛لا أعرفه، لذا سأستخدمه
array_unique
)
- اجعلها فريدة من نوعها، لأنها قد تظهر عدة مرات (قد تكون هناك طريقة للقيام بذلك باستخدام XPath ؛لا أعرفه، لذا سأستخدمه
- التكرار على هذه الأنواع، باستخدام ماذا @ مارك المقترح.
من المحتمل أن يفعل شيء مثل هذا:
$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 :
فار_تفريغ #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)
فار_تفريغ #2 :
array
0 => string 'Movie' (length=5)
1 => string 'Movie' (length=5)
2 => string 'Book' (length=4)
فار_تفريغ #3 :
array
0 => string 'Movie' (length=5)
2 => string 'Book' (length=4)
فار_تفريغ #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)
والآن، الأمر متروك لك لتقديم هذه البيانات بالطريقة التي تريدها؛بناء حلقة مزدوجة foreach <ul>
و <li>
من المحتمل أن تفعل العلامات ;-)
نصائح أخرى
أعتقد أنك تبحث عن 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;
}
لا تنتمي إلى StackOverflow