Это пример моего 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 protected]</EMAIL>
<URL>http://www.company.com</URL>
</ROW>
Это мой PHP:
<?php
$xml = simplexml_load_file('department.xml');
foreach($xml->children() as $depts) {
echo $depts->DEPARTMENT . "<br />";
}
?>
Он правильно выводит список отделов в порядке их появления в XML, но я хочу, чтобы он сортировал альфа по узлу DEPARTMENT.
Я не думаю, что пример соответствует вашему 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>
Вам нужно будет получить все ROW
элементы в первую очередь. SimpleXML добавляет множество интерфейсов и магию синтаксиса. Но SimpleXMLElement::xpath()
может вернуть массив объектов. После того, как вы получили массив, вы можете использовать uasort()
отсортировать его с помощью функции сравнения.
$records = simplexml_load_string($xml);
$list = $records->xpath('/*/ROW');
uasort(
$list,
function($one, $two) {
return strcasecmp($one->DEPARTMENT, $two->DEPARTMENT);
}
);
var_dump($list);
Выход:
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);
Если все ОТДЕЛЕНИЯ уникальны, сделайте:
<?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 = 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>";