@Kak_B_CTapou_Cka3ke

Как при использовании simplexml_load_file получить нужное содержимое?

Есть xml файл вида:
<item color1="ffffff" color2="ffffff" cooldown="180000" description="&lt;font color=&quot;c4f5f6&quot;  size=&quot;7&quot;  bold=&quot;0&quot;  italic=&quot;0&quot;  underline=&quot;0&quot;  name=&quot;Arial&quot; />&lt;text align=&quot;W&quot;>&#xA;&#xA;&lt;/text>" getTooltip="0" heap="0" icon="armboots0031" itemlvl="40" maxdurability="600" name="Зачарованные сапоги" name_end="4" quested="0" race="0" reqlvl="40" scale="0.0130" slot="12" subtype="AB" typeid="7393" typename="armor" url="boots_steel" useas="1">
    <bonus id="99" value="20.000000"/>
    <bonus id="256" value="0.650000"/>
    <bonus id="257" value="0.490000"/>
    <bonus id="2" value="210.000000"/>
    <bonus id="244" value="0.600000"/>
    <bonus id="248" value="0.520000"/>
    <bonus id="249" value="0.410000"/>
    <bonus id="304" value="1.000000"/>
    <bonus id="0" value="0.000000"/>
    <bonus id="0" value="0.000000"/>
  </item>

  <item color1="ffffff" color2="ffffff" cooldown="180000" description="&lt;font color=&quot;c4f5f6&quot;  size=&quot;7&quot;  bold=&quot;0&quot;  italic=&quot;0&quot;  underline=&quot;0&quot;  name=&quot;Arial&quot; />&lt;text align=&quot;W&quot;>&#xA;&#xA;&lt;/text>" getTooltip="0" heap="0" icon="armpants0039" itemlvl="40" maxdurability="600" name="Зачарованные поножи" name_end="4" quested="0" race="0" reqlvl="40" scale="0.0130" slot="11" subtype="AL" typeid="7394" typename="armor" url="pants1" useas="1">
    <bonus id="99" value="21.000000"/>
    <bonus id="256" value="0.580000"/>
    <bonus id="257" value="0.510000"/>
    <bonus id="2" value="410.000000"/>
    <bonus id="248" value="0.650000"/>
    <bonus id="249" value="0.550000"/>
    <bonus id="240" value="0.020000"/>
    <bonus id="304" value="1.000000"/>
    <bonus id="0" value="0.000000"/>
    <bonus id="0" value="0.000000"/>
  </item>


Как при помощи simplexml_load_file получить все bonus id и value для каждого item'a в виде массива с ключом id и значением value: 99=>21, 256=>0.58, 257=>0.51 и тд
Получилось сделать только так, что к каждому item'y подтягивается только первый bonus.

$feedObj = simplexml_load_file("type.xml");
$arr = [];
  foreach($feedObj as $items) {      
    $name = (string)$items[name];
    $typeid = (string)$items[typeid];
    $typename = (string)$items[typename];
    $url = (string)$items[url];
    $bonusArr = json_decode(json_encode($items->bonus), TRUE); 
    $arr[$name] = [$typeid,$typename,$url,$bonusArr];
  }


var_dump($arr['Зачарованные поножи']);

array(4) { 
[0]=> string(4) "7394" 
[1]=> string(5) "armor" 
[2]=> string(6) "pants1" 
[3]=> array(1) { ["@attributes"]=> array(2) { ["id"]=> string(2) "99" ["value"]=> string(9) "21.000000" } } }


Спасибо.
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
@YankiMax
Ну, как вариант:
<?php
$feedObj = simplexml_load_file("type.xml");
$arr = [];

foreach ($feedObj as $item):
	foreach($item->bonus as $bonus):
		$arr[(string)$item["name"]][(string)$bonus["id"]] = (string)$bonus["value"];
	endforeach;
endforeach;
echo "<pre>";
var_dump($arr);
echo "</pre>";


Результат:
array(2) {
  ["Зачарованные сапоги"]=>
  array(9) {
    [99]=>
    string(9) "20.000000"
    [256]=>
    string(8) "0.650000"
    [257]=>
    string(8) "0.490000"
    [2]=>
    string(10) "210.000000"
    [244]=>
    string(8) "0.600000"
    [248]=>
    string(8) "0.520000"
    [249]=>
    string(8) "0.410000"
    [304]=>
    string(8) "1.000000"
    [0]=>
    string(8) "0.000000"
  }
  ["Зачарованные поножи"]=>
  array(9) {
    [99]=>
    string(9) "21.000000"
    [256]=>
    string(8) "0.580000"
    [257]=>
    string(8) "0.510000"
    [2]=>
    string(10) "410.000000"
    [248]=>
    string(8) "0.650000"
    [249]=>
    string(8) "0.550000"
    [240]=>
    string(8) "0.020000"
    [304]=>
    string(8) "1.000000"
    [0]=>
    string(8) "0.000000"
  }
}

Но при этом, когда id совпадают, то у тебя будет только последняя запись (у тебя 0 дублируется зачем-то)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы