0

所以假设我有一个这样的 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>

我需要把它变成一个下拉列表,其中显示的值是动物名称,但按字母顺序排列,与该显示值关联的值是动物 ID。

在我看来,我应该能够执行以下操作:

<?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;
 ?>

更新

所以这就是我现在所拥有的

$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”“array”

4

6 回答 6

2

很难说出您的期望,但我认为您可能正在寻找这个:

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

也就是说,如果您希望 $animalArray 看起来像这样:

array(
    "Joo" => 1,
    "Moo" => 1,
    "Foo" => 1,
)
于 2013-01-29T23:52:04.493 回答
1

您没有正确分配数组元素。尝试这个:

foreach($xml->animal as $child)
 {
   $animalArray[$child->Name] = $child->aniID;
 }
于 2013-01-29T23:52:27.580 回答
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 对象而不是值

于 2013-01-29T23:53:28.280 回答
0

小题外话:附加到字符串是相当慢的操作。使用输出缓冲区和回显要快得多。见http://php.net/manual/en/function.ob-start.php

于 2013-01-30T00:37:03.670 回答
0

如果您尝试向accociative 数组添加新索引,请使用以下代码

foreach($xml->animal as $child)
{
   $animalArray[$child->Name] = $child->aniID;
}
于 2013-01-29T23:52:07.683 回答
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.
于 2013-01-29T23:59:00.050 回答