2013-01-29 2 views
0

Так скажем, у меня есть файл XML, как этотВвод XML в массив затем сортировать?

<allAnimals> 
    <animal> 
    <aniID>1</aniID> 
    <name>Joo</name> 
    </animal> 
    <animal> 
    <aniID>2</aniID> 
    <name>Moo</name> 
    </animal> 
    <animal> 
    <aniID>1</aniID> 
    <name>Foo</name> 
    </animal> 
</allAnimals> 

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

На мой взгляд, я должен быть в состоянии сделать что-то вроде:

<?php 
$xml=simplexml_load_file("animal.xml") 
$animalArray = array(); 
foreach($xml->animal as $child) 
{ 
    $animalArray[$child->name]= $child->aniID; 
} 
ksort($animalArray); 
$page.="<Select>"; 
foreach($animalArray AS $key=>$value) 
{ 
    $page.='<option value="'.$value.'">'.$key."</option>"; 
} 
return $page; 
?> 

UPDATE

Так это то, что я сейчас

$xml = simplexml_load_file("animal.xml"); 

$animals = array(); 
foreach($xml->organization as $child) { 
    $animals[] = array('id' => $child->aniID, 'name' => $child->Name); 
} 
$page.="<select>"; 

foreach($animals AS $aniId=>$name) 
{ 
    $page.='<option value="'.$aniId.'">'.$name."</option>"; 
} 
$page.="</select>"; 

Давайте не будем беспокоиться о сортировке прямо теперь, потому что теперь все, что я получаю в списке выбора, это "array" "array" «массив»

+0

Какая ошибка у вас возникла? – hek2mgl

+0

FYI: вы заполняете массив «name» как ключ и «aniID» в качестве значения, но вы перевернули их в своем foreach. 'foreach ($ animalArray as $ name => $ aniID) ...' вероятно, вы хотите. – glomad

+0

@ user1807404 Пожалуйста, прекратите изменять свой код в вопросе. Это аннулирует все ответы, которые уже предоставили люди. – glomad

ответ

3

Это трудно сказать, что вы ожидали, но я думаю, что вы могли бы искать для этого:

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

array(
    "Joo" => 1, 
    "Moo" => 1, 
    "Foo" => 1, 
) 
+0

Я обновил его, так что теперь массив должен быть правильным, но я получаю пустой список ... – user1807404

+0

и что вы видите, когда вы 'print_r ($ animalArray)'? – glomad

+0

Когда я делаю print_r, я получаю Array ([0] => Array() [1] => Array() [2] => Array() [3] => Array() [4] => Array()) – user1807404

0

Если вы пытаетесь добавить новый индекс к accociative array использовать следующий код

foreach($xml->animal as $child) 
{ 
    $animalArray[$child->Name] = $child->aniID; 
} 
1

Вы не задаете элементы массива правильно. Попробуйте это:

foreach($xml->animal as $child) 
{ 
    $animalArray[$child->Name] = $child->aniID; 
} 
1

Попробуйте это:

foreach($xml->animal as $child) { 
    // cast to integer to prevent SimpleXmlElement being used as key 
    $aniID = (int) $child->aniID; 
    $animalArray[$aniID] = (string) $child->Name; 
} 

// sort by value 
asort($animalArray); 

Я предполагаю, что здесь, что «aniID» является уникальным и «имя» может быть не уникальным, поэтому я выбрал aniID быть ключом моего ассоциативного массива

затем выводить результаты

foreach($animalArray AS $aniId=>$name) 
{ 
    $page.='<option value="'.$aniId.'">'.$name."</option>"; 
} 

[обновлено] Добавлено литая ИНГ для предотвращения объектов SimpleXML используется вместо значения

0

Посмотрите на функцию usort: http://php.net/manual/en/function.usort.php

$xml = simplexml_load_file("animal.xml"); 

$animals = array(); 
foreach($xml->animal as $child) { 
    $animals[] = array('id' => $child->aniID, 'name' => $child->Name); 
} 

usort($animals, function($a, $b) { return strcoll($a['name'], $b['name']); }); 

// Now $animals are sorted by name. 
+0

Кажется, это приближает меня к тому, где я сейчас, пожалуйста, посмотрите мое обновление и скажите, почему в моем списке выбора нет ничего, кроме «массива». – user1807404

+0

Becouse is not key => value, но массив массивов. $ name содержит массив, поэтому вы хотите: $ page. = '"; –

0

Маленький оффтоп: Прикрепление к строке довольно медленная операция. Использование выходного буфера и эха происходит намного быстрее. См. http://php.net/manual/en/function.ob-start.php

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