Сортировка строк XML в алфавитном порядке по одному узлу с использованием переполнения стека

Это пример моего 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.

1

Решение

Я не думаю, что пример соответствует вашему 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);
0

Другие решения

Если все ОТДЕЛЕНИЯ уникальны, сделайте:

<?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 />";
}
?>
0

Все вышеприведенные ответы, казалось, показали часть того, чем я закончил, но я добавляю окончательные результаты на случай, если это будет полезно для кого-то другого:

$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>";
0
По вопросам рекламы [email protected]