Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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_Xml_Sorting_Alphabetical - Fatal编程技术网

使用PHP按一个节点的字母顺序对XML行进行排序

使用PHP按一个节点的字母顺序对XML行进行排序,php,xml,sorting,alphabetical,Php,Xml,Sorting,Alphabetical,这是我的XML的一个示例: <ROW> <DEPT_CODE>11111</DEPT_CODE> <DEPARTMENT>Program Name</DEPARTMENT> <BLDG_CODE>BLCG</BLDG_CODE> <ADDR_STREET1>123 Main Street</ADDR_STREET1> <ADDR_STREET2>Suite 456</AD

这是我的XML的一个示例:

<ROW>
<DEPT_CODE>11111</DEPT_CODE>
<DEPARTMENT>Program Name</DEPARTMENT>
<BLDG_CODE>BLCG</BLDG_CODE>
<ADDR_STREET1>123 Main Street</ADDR_STREET1>
<ADDR_STREET2>Suite 456</ADDR_STREET2>
<ADDR_STREET3>Lower Level</ADDR_STREET3>
<ADDR_CITY>New York</ADDR_CITY>
<ADDR_STATE>NY</ADDR_STATE>
<ADDR_ZIP>101010</ADDR_ZIP>
<PHONE>212-555-1234</PHONE>
<FAX>212-555-5678</FAX>
<EMAIL>email@company.com</EMAIL>
<URL>http://www.company.com</URL>
</ROW>

11111
程序名
BLCG
大街123号
456套房
下层
纽约
纽约
101010
212-555-1234
212-555-5678
email@company.com
http://www.company.com
这是我的PHP:

<?php
$xml = simplexml_load_file('department.xml');
foreach($xml->children() as $depts) {
echo $depts->DEPARTMENT . "<br />";
}
?>


它按照部门在XML中的显示顺序正确输出部门列表,但我希望它按部门节点对alpha进行排序。

如果所有部门都是唯一的,请执行以下操作:

<?php
$xml = simplexml_load_file('department.xml');
foreach($xml->children() as $depts) {
  $collect[(string)$depts->DEPARTMENT]=$depts;
}
ksort($collect);
foreach($collect as $depts) {
  echo $depts->DEPARTMENT . "<br />";
}
?>

如果所有部门都是唯一的,请执行以下操作:

<?php
$xml = simplexml_load_file('department.xml');
foreach($xml->children() as $depts) {
  $collect[(string)$depts->DEPARTMENT]=$depts;
}
ksort($collect);
foreach($collect as $depts) {
  echo $depts->DEPARTMENT . "<br />";
}
?>

我认为该示例与您的XML不匹配。它只包含一行,所以对它进行排序毫无意义。比如说你有这样的东西:

<records>
  <ROW>
    <DEPT_CODE>11111</DEPT_CODE>
    <DEPARTMENT>Program Name DEF</DEPARTMENT>
  </ROW>
  <ROW>
    <DEPT_CODE>12222</DEPT_CODE>
    <DEPARTMENT>Program Name ABC</DEPARTMENT>
  </ROW>
</records>
输出:

array(2) {
  [1]=>
  object(SimpleXMLElement)#3 (2) {
    ["DEPT_CODE"]=>
    string(5) "12222"
    ["DEPARTMENT"]=>
    string(16) "Program Name ABC"
  }
  [0]=>
  object(SimpleXMLElement)#2 (2) {
    ["DEPT_CODE"]=>
    string(5) "11111"
    ["DEPARTMENT"]=>
    string(16) "Program Name DEF"
  }
}
顺便说一句,在DOM中,它将如下所示:

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$list = iterator_to_array($xpath->evaluate('/*/ROW'));
uasort(
  $list,
  function($one, $two) use ($xpath) {
    return strcasecmp(
      $xpath->evaluate('string(DEPARTMENT)', $one), 
      $xpath->evaluate('string(DEPARTMENT)', $two)
    );
  } 
);

var_dump($list);

我认为这个示例与您的XML不匹配。它只包含一行,所以对它进行排序毫无意义。比如说你有这样的东西:

<records>
  <ROW>
    <DEPT_CODE>11111</DEPT_CODE>
    <DEPARTMENT>Program Name DEF</DEPARTMENT>
  </ROW>
  <ROW>
    <DEPT_CODE>12222</DEPT_CODE>
    <DEPARTMENT>Program Name ABC</DEPARTMENT>
  </ROW>
</records>
输出:

array(2) {
  [1]=>
  object(SimpleXMLElement)#3 (2) {
    ["DEPT_CODE"]=>
    string(5) "12222"
    ["DEPARTMENT"]=>
    string(16) "Program Name ABC"
  }
  [0]=>
  object(SimpleXMLElement)#2 (2) {
    ["DEPT_CODE"]=>
    string(5) "11111"
    ["DEPARTMENT"]=>
    string(16) "Program Name DEF"
  }
}
顺便说一句,在DOM中,它将如下所示:

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$list = iterator_to_array($xpath->evaluate('/*/ROW'));
uasort(
  $list,
  function($one, $two) use ($xpath) {
    return strcasecmp(
      $xpath->evaluate('string(DEPARTMENT)', $one), 
      $xpath->evaluate('string(DEPARTMENT)', $two)
    );
  } 
);

var_dump($list);

以上所有答案似乎都显示了我最终得到的一部分,但我添加了最终结果,以防对其他人有所帮助:

$xml = simplexml_load_file('data.xml');
foreach($xml->children() as $departments) {
    (string)$collect[(string)$departments->DEPT_NAME]=$departments;
}

usort ($collect, function($a, $b) {
    return strcmp($a->DEPT_NAME, $b->DEPT_NAME);
});

echo "<ul>";
    foreach($collect as $departments) {
        if ($departments->DEPT_NAME != "") {
            echo "<li>" . $departments->DEPT_NAME . "</li>";
        }
    }
echo "</ul>";
$xml=simplexml\u load\u文件('data.xml');
foreach($xml->children()作为$departments){
(字符串)$collect[(字符串)$departments->department\u NAME]=$departments;
}
usort($collect,function($a,$b){
返回strcmp($a->DEPT\u NAME,$b->DEPT\u NAME);
});
回声“
    ”; foreach($部门收款){ 如果($departments->DEPT_NAME!=“”){ 回显“
  • ”$departments->depart_NAME。”
  • ”; } } 回声“
”;
以上所有答案似乎都显示了我最终得到的一部分,但我正在添加最终结果,以防对其他人有所帮助:

$xml = simplexml_load_file('data.xml');
foreach($xml->children() as $departments) {
    (string)$collect[(string)$departments->DEPT_NAME]=$departments;
}

usort ($collect, function($a, $b) {
    return strcmp($a->DEPT_NAME, $b->DEPT_NAME);
});

echo "<ul>";
    foreach($collect as $departments) {
        if ($departments->DEPT_NAME != "") {
            echo "<li>" . $departments->DEPT_NAME . "</li>";
        }
    }
echo "</ul>";
$xml=simplexml\u load\u文件('data.xml');
foreach($xml->children()作为$departments){
(字符串)$collect[(字符串)$departments->department\u NAME]=$departments;
}
usort($collect,function($a,$b){
返回strcmp($a->DEPT\u NAME,$b->DEPT\u NAME);
});
回声“
    ”; foreach($部门收款){ 如果($departments->DEPT_NAME!=“”){ 回显“
  • ”$departments->depart_NAME。”
  • ”; } } 回声“
”;

应该是这样的。从DOM中获取数据的顺序是原始xml中出现的顺序。如果您想要一个特定的排序,您必须自己进行:获取部门名称、存储在数组中、对数组排序、输出。您还可以使用样式表格式化输出——应用转换和排序,这就是它应该的方式。从DOM中获取数据的顺序是原始xml中出现的顺序。如果您想要一个特定的排序,您必须自己进行:获取部门名称、存储在数组中、对数组排序、输出。您还可以使用样式表格式化输出—应用转换和排序,只需一个小的编辑。起初,我在
$collect
行收到一条“警告:非法偏移类型”。然后将该行调整如下:
(string)$collect[(string)$depts->DEPARTMENT]=$depts而且效果很好!!请修改您的答案,以便我能将其标记为正确。我正在对员工应用相同的方法,我发现ksort区分大小写,有三名员工的姓氏以小写字母开头。当我尝试natcasesort时,它完全不正常。。。思想?另外,@justonundermillions查看上面的评论,调整您的答案,以便我可以将其标记为correct。此外,@justonundermillions ksort删除所有姓氏相同的员工。有什么想法吗?
(string)$depts
完成,不需要这个
(string)$collect
,因为typecast to string的结果不会在任何地方使用,而且
$collect
仍然是行后的一个数组。而
ksort
只需命令数组的键,不删除任何内容,正如我所指出的,如果有两个元素具有相同的
部门
,那么最后一个元素将被下一个元素覆盖。例如
$a['key']=1$a['key']=2$a['key']=3结果<代码>['key'=>3]
只需一个小编辑,即可工作。起初,我在
$collect
行收到一条“警告:非法偏移类型”。然后将该行调整如下:
(string)$collect[(string)$depts->DEPARTMENT]=$depts而且效果很好!!请修改您的答案,以便我能将其标记为正确。我正在对员工应用相同的方法,我发现ksort区分大小写,有三名员工的姓氏以小写字母开头。当我尝试natcasesort时,它完全不正常。。。思想?另外,@justonundermillions查看上面的评论,调整您的答案,以便我可以将其标记为correct。此外,@justonundermillions ksort删除所有姓氏相同的员工。有什么想法吗?
(string)$depts
完成,不需要这个
(string)$collect
,因为typecast to string的结果不会在任何地方使用,而且
$collect
仍然是行后的一个数组。而
ksort
只需命令数组的键,不删除任何内容,正如我所指出的,如果有两个元素具有相同的
部门
,那么最后一个元素将被下一个元素覆盖。例如
$a['key']=1$a['key']=2$a['key']=3结果
['key'=>3]
好吧,示例XML只是结构化的。当然不止一个部门。我还会检查并测试您的解决方案。谢谢你的参与!我尝试了此操作,但收到了以下错误:
警告:simplexml_load_string()[]:实体:第58行:解析器错误:应为开始标记,'正在加载的XML无效/已损坏。使用其他方法输出良好,它只是拒绝对alpha排序,因此我也尝试了此方法。错误发生在执行任何排序逻辑之前。错误消息清楚地报告无法加载XML。那与机智无关