Php 将XML放入数组然后排序?
假设我有一个这样的XML文件Php 将XML放入数组然后排序?,php,arrays,Php,Arrays,假设我有一个这样的XML文件 <allAnimals> <animal> <aniID>1</aniID> <name>Joo</name> </animal> <animal> <aniID>2</aniID> <name>Moo</name> </animal> <animal>
<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>
1.
乔
2.
哞
1.
福
我需要将其放入一个下拉列表中,其中显示的值是动物名称,但按字母顺序排列,与该显示值关联的值是动物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>";
$xml=simplexml\u load\u文件(“animal.xml”);
$anives=array();
foreach($xml->organization as$child){
$animals[]=数组('id'=>$child->aniID,'name'=>$child->name);
}
$page.=”;
foreach($aniId=>$name的动物)
{
$page.=''.$name.'';
}
$page.=”;
现在我们不必担心排序问题,因为现在我在选择列表中得到的是
“数组”
“数组”
“数组”很难说出您的期望值,但我认为您可能正在寻找以下内容:
foreach($xml->animal as $child)
{
$animalArray[$child->Name] = $child->aniID;
}
也就是说,如果希望$animalArray如下所示:
array(
"Joo" => 1,
"Moo" => 1,
"Foo" => 1,
)
很难说你在期待什么,但我想你可能在寻找这个:
foreach($xml->animal as $child)
{
$animalArray[$child->Name] = $child->aniID;
}
也就是说,如果希望$animalArray如下所示:
array(
"Joo" => 1,
"Moo" => 1,
"Foo" => 1,
)
如果您尝试将新索引添加到,请使用以下代码
foreach($xml->animal as $child)
{
$animalArray[$child->Name] = $child->aniID;
}
如果您尝试将新索引添加到,请使用以下代码
foreach($xml->animal as $child)
{
$animalArray[$child->Name] = $child->aniID;
}
您没有正确分配数组元素。试试这个:
foreach($xml->animal as $child)
{
$animalArray[$child->Name] = $child->aniID;
}
您没有正确分配数组元素。试试这个:
foreach($xml->animal as $child)
{
$animalArray[$child->Name] = $child->aniID;
}
试试这个:
foreach($xml->animal as $child)
{
$animalArray[$child->Name] = $child->aniID;
}
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’是唯一的,而‘name’可能不是唯一的,因此我选择aniID作为关联数组的键
然后输出结果
foreach($animalArray AS $aniId=>$name)
{
$page.='<option value="'.$aniId.'">'.$name."</option>";
}
foreach($animalArray作为$aniId=>$name)
{
$page.=''.$name.'';
}
[更新]
添加了强制转换以防止使用SimpleXml对象而不是值尝试以下操作:
foreach($xml->animal as $child)
{
$animalArray[$child->Name] = $child->aniID;
}
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’是唯一的,而‘name’可能不是唯一的,因此我选择aniID作为关联数组的键
然后输出结果
foreach($animalArray AS $aniId=>$name)
{
$page.='<option value="'.$aniId.'">'.$name."</option>";
}
foreach($animalArray作为$aniId=>$name)
{
$page.=''.$name.'';
}
[更新]
添加了强制转换以防止使用SimpleXml对象而不是值查看usort函数:
$xml=simplexml\u load\u文件(“animal.xml”);
$anives=array();
foreach($xml->animalas$child){
$animals[]=数组('id'=>$child->aniID,'name'=>$child->name);
}
usort($animals,function($a,$b){返回strcoll($a['name'],$b['name']);});
//现在,$动物按名称排序。
看看usort函数:
$xml=simplexml\u load\u文件(“animal.xml”);
$anives=array();
foreach($xml->animalas$child){
$animals[]=数组('id'=>$child->aniID,'name'=>$child->name);
}
usort($animals,function($a,$b){返回strcoll($a['name'],$b['name']);});
//现在,$动物按名称排序。
有点离题:附加到字符串是一个非常慢的操作。使用输出缓冲区和回显要快得多。请参见小标题:附加到字符串是一个非常慢的操作。使用输出缓冲区和回显要快得多。请参见当您打印($animalArray)时,您会看到什么?当我打印时,我会得到数组([0]=>Array()[1]=>Array()[2]=>Array()[3]=>Array()[4]=>Array())嗯,您更改了代码,因此数组不适合您尝试访问它的方式。现在你有了一个数组,但是你把它当作一个关联数组<代码>$animals[]=array('id'=>$child->aniID,'name'=>$child->name)意味着foreach($key=>value)将不再工作。你必须foreach($animalArray)
,然后在foreach循环中使用$animal['id']
和$animal['name']
。当你打印($animalArray)
时,你会看到什么?当我打印时,我会得到数组([0]=>Array()[1]=>Array()[2]=>Array()[3]=>Array()[4]=>Array())您更改了代码,因此数组不适合您尝试访问它的方式。现在你有了一个数组,但是你把它当作一个关联数组<代码>$animals[]=array('id'=>$child->aniID,'name'=>$child->name)
意味着foreach($key=>value)将不再工作。您必须foreach($animals as$animal)
,然后在foreach循环中使用$animal['id']
和$animal['name']
。仅供参考:您将数组填充为name
键和aniID
值,但它们在foreach中已反转foreach($name=>animalArray$aniID).
可能是您想要的。@user1807404请停止更改问题中的代码。它使人们已经提供的所有答案无效。我很抱歉。下次我将把它粘贴到下面。@user1807404您上次的粘贴毫无意义,首先,您现在使用$xml->organization(?)。此外,您正在创建一个数组数组,而不是关联数组。此外,正如ithcy所提到的,通过编辑您的问题,下面的所有答案都不再与您的问题匹配。仅供参考:您正在使用name
作为键和aniID
作为值填充数组,但您在foreach中已将它们颠倒过来foreach($name=>animalArray$aniID).
可能是您想要的。@user1807404请停止更改问题中的代码。它使人们已经提供的所有答案无效。我很抱歉。下次我将把它粘贴到下面。@user1807404您上次的粘贴毫无意义,首先,您现在使用$xml->organization(?)。此外,您正在创建一个数组数组,而不是关联数组。此外,正如ithcy提到的,通过编辑您的问题,下面的所有答案都不再符合您的问题。这似乎让我更接近我现在的位置,请查看我的更新,告诉我为什么我的选择列表中只有“数组”,因为它不是key=>value,而是数组数组$名称包含数组,因此需要:$pag