2010-10-12 3 views
0

У меня очень плохой мозговой блок с этим.Easy PHP SimpleXML Issue

Мой файл XML выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
    <fruits> 
    <item>Apple</item> 
    <item>Orange</item> 
    <item>Banana</item> 
    </fruits> 
    <vegetables> 
    <item>Lettuce</item> 
    <item>Carrot</item> 
    </vegetables> 
</data> 

Я Tyring использовать SimpleXML для извлечения массива, содержащего "яблоко, апельсин, банан". Используемый мной код выглядит следующим образом:

$xml=simplexml_load_file('food.xml'); 

foreach($xml as $fruits=>$item) { 
    $foodlist[] = $item; 
} 

print_r($foodlist); // Should display list of fruits. 

Но список фруктов не хранится в массиве. Что я делаю не так?

Большое спасибо.

+0

'print_r ($ xml);' и распечатать результаты здесь, пожалуйста? – hookedonwinter

+0

Что именно вы видите? Ничего? Или просто не то, что вы ожидали? – Jonah

+0

hookedonwinter: Я получаю объект SimpleXMLElement ([fruits] => объект SimpleXMLElement ([item] => Array ([0] => Apple [1] => оранжевый [2] => банана)) [овощи] => SimpleXMLElement Объект ([item] => Массив ([0] => Салат-латук [1] ​​=> Морковь))) ' – Rudi

ответ

1

Как об этом:

foreach($xml->fruits->item as $item) { 
    //$item has to be cast to a string otherwise it will be a SimpleXML element 
    $foodlist[] = (string) $item; 
} 
print_r($foodlist); 

Я думаю, что это должно дать вам то, что вы ищете, массив, содержащий текстовое значение каждого из узлов элемента, которые являются дочерними узлами узла фруктов.

+0

Бинго. Спасибо кучу всем. Это простое упражнение научило меня много! :) – Rudi

0

Try foreach($xml['data'] as $fruits=>$item)

---- редактировать ----

foreach($xml as $fruits => $item) { 
    if($fruits == "fruits") 
     $foodlist[] = $item; 
} 
+0

Это тоже пройдет через овощи. – ceejayoz

+0

Спасибо, но это возвращает синтаксическую ошибку. :) – Rudi

+0

@ceejayoz это правда. Обновлено – hookedonwinter

1

Я проверил ваш код. Он отлично работает для меня. Другое дело - возможно, вы описали это неправильно или, может быть, понимаете это неправильно. $ foodlist должен содержать массив объектов элемента SimpleXML (в вашем случае «<fruits>» и «<vegetables>»), а не массив фруктов. Если вы хотите получить только фрукты, вы должны получить доступ к $xml->fruits->item;.

Edit: если вы хотите построить массив из фруктов, попробуйте следующее:

$array = (array)$xml->fruits; 
print_r($array['item']); // Should dipslay list of fruits 

//or this 
foreach ($xml->fruits->item as $fruit){ 
    $array2[] = (string) $fruit; //typecast to string, because $fruit is xml element object. 
} 
print_r($array2); // Should dipslay list of fruits 
+0

Спасибо за это. Я думаю, мы близки. В основном я хочу, чтобы мой последний массив ($ foodlist) был идентичен тому, что было бы, если бы я использовал эту команду: '$ foodlist = array (« Apple »,« Orange »,« Banana »);'. Я просто хочу, чтобы это был прямой массив, лишенный какой-либо ссылки на исходный XML. Каков наилучший способ сделать это? – Rudi

+0

Вы можете придумать объект $ xml-> fruits' для массива ('$ array = (array) $ xml-> fruits;'.Ваши плоды будут в '$ array ['item']'. Также вы можете попробовать этот 'foreach ($ xml-> fruit-> item as $ fruit) { $ array [] = (строка) $ fruit; // typecast to string, потому что $ fruit - это объект элемента xml. } 'Это самая близкая вещь, которую я могу получить, не исследуя больше в simpleXML. :) – egis

+0

Извините за плохое форматирование кода в предыдущем комментарии. – egis