Я думаю, что люди, предлагающие использовать SimpleDOM , будут мной.:)
Я написал SimpleDOM :: sort () именно для этой ситуации, потому что для сортировки SimpleXMLElements по арбитражному выражению (или произвольным выражениям) необходимо использовать array_multisort()
это скучно и не научит вас чему-нибудь полезному.
Вот краткая версия того, как это работает: сначала вы создаете прокси-массив пар ключ => значение, соответствующих каждому элементу SimpleXMLElement и значению, с которым онибуду сортировать.В вашем примере, если вы хотите отсортировать их по <age/>
, массив будет array(21, 56)
.Затем вы вызываете array_multisort()
с «массивом прокси» в качестве первого аргумента, за которым следует любое количество модификаторов сортировки , таких как SORT_DESC или SORT_NUMERIC, затем, наконец, массив, который вы хотите отсортировать, который будет передан по ссылке.
В итоге вы получите нечто подобное:
$nodes = array(
new SimpleXMLElement('<person><name>Andrew</name><age>21</age></person>'),
new SimpleXMLElement('<person><name>Beth</name><age>56</age></person>')
);
function xsort(&$nodes, $child_name, $order = SORT_ASC)
{
$sort_proxy = array();
foreach ($nodes as $k => $node)
{
$sort_proxy[$k] = (string) $node->$child_name;
}
array_multisort($sort_proxy, $order, $nodes);
}
xsort($nodes, 'name', SORT_ASC);
print_r($nodes);
xsort($nodes, 'age', SORT_DESC);
print_r($nodes);
Но на самом деле, вместо того, чтобы обременять себя большим количеством кода, вам придется поддерживать и, возможно, в конечном итоге переписать array_multisort()
в пользовательском пространстве., вы должны использовать существующие решения.В таком алгоритме / рутине сортировки нет ничего интересного, лучше потратить время на то, чего еще не существует.