Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将XML放入数组然后排序?_Php_Arrays - Fatal编程技术网

Php 将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>

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

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