Работает ли PHP usort () в DOM nodeLists? - PullRequest
0 голосов
/ 03 января 2012

У меня есть куча данных, хранящихся в файле XML, которые я распечатываю в виде списка с помощью PHP. Я хочу, чтобы пользователь мог выбрать способ сортировки списка.

Я немного поэкспериментировал с usort(), но, похоже, он не работает. Это не исключение, поэтому я думаю, что это выполнимо, но с моей функцией сортировки что-то не так. Первое, что я хочу сделать, - это отсортировать данные по дате их создания - они хранятся в таком атрибуте, как этот:

<root>
    <info created="2011-12-31">
        <sometags />
    </info>
    <info created="2012-01-02">
        <sometags />
    </info>
    <info created="2012-01-01">
        <sometags />
    </info>
</root>

и моя сортировка сделана так:

function sortByDate($a, $b) {

    //get array of year, month and day
    $adates = explode('-', $a->getAttribute('created'));
    $bdates = explode('-', $b->getAttribute('created'));

    //if the years are not the same, use them to sort
    if ($adates[0] != $bdates[0]) {
        return (intval($adates[0]) < intval($bdates[0])) ? -1 : 1;
    }
    //if the years are the same, try sorting by the months
    else if ($adates[1] != $bdates[1]) {
        return (intval($adates[1]) < intval($bdates[1])) ? -1 : 1;
    }
    //if the years and months are both the same, try sorting by days
    else {
        return (intval($adates[2]) < intval($bdates[2])) ? -1 : 1;
    }

    //if we get this far, the dates are identical
    return 0;
}

и вот как я это называю:

$xmlDoc = new DOMDocument();
$xmlDoc->load('data.xml');

$infotags = $xmlDoc->documentElement->getElementsByTagName('info');

usort($infotags, 'sortByDate');

Это какая-то глупая ошибка, которую я сделал, или я должен делать что-то еще полностью?

Кстати, я знаю, что приведенная выше конструкция if... else на самом деле не будет сортировать даты в правильном порядке. Я просто пытаюсь заставить его сделать что-то - в данный момент usort() просто оставляет список узлов в том же порядке, в котором он был начат.

1 Ответ

0 голосов
/ 03 января 2012

getElementsByTagName возвращает DOMNodeList, который является Итератором, а не реальным массивом.Поэтому вы не можете изменить порядок списка.

Попробуйте сначала преобразовать его в массив.

...