Использование usort с simplexml - PullRequest
       33

Использование usort с simplexml

1 голос
/ 10 ноября 2011

У меня проблема с тем, что ни одно из моих значений не заканчивается в правильном порядке.

        $xml = file_get_contents('admin/people.xml');
        $x = new SimpleXMLElement($xml);

        $sort=$x->person;

        function cmp($a, $b){
            if ($a->age == $b->age) {
                return 0;
            }
            return ($a->age < $b->age) ? -1 : 1;
        }
        usort($sort, 'cmp');

        foreach ($sort as $key => $value) {
            echo "$key: $value->age<br>";
        }

Из всего, что я прочитал, это должно работать, но это не так.Вот XML:

        <people>
            <person>
                <name>Frank</name>
                <age>12</age>
            </person>
            <person>
                <name>Jim</name>
                <age>6023</age>
            </person>
            <person>
                <name>Tony</name>
                <age>234</age>
            </person>
            <person>
                <name>Bob</name>
                <age>2551</age>
            </person>
            <person>
                <name>Dave</name>
                <age>21</age>
            </person>
            <person>
                <name>Trevor</name>
                <age>56</age>
            </person>
            <person>
                <name>Mike</name>
                <age>89</age>
            </person>
        </people>

И результат, который я получаю, таков: это совсем не порядок!

0: 6023
2: 21
3: 234
4: 12
6: 56
7: 2551
8: 89

Есть идеи?

Большое спасибо ...

Ответы [ 2 ]

1 голос
/ 10 ноября 2011
  • usort принимает массив.
  • Когда вы сравниваете два элемента SimpleXMLElement, вы должны разыграть их.

Так измените код

$sort=$x->person;

function cmp($a, $b){
    if ($a->age == $b->age) {
        return 0;
    }
    return ($a->age < $b->age) ? -1 : 1;
}

до

$sort = array();
foreach ($x->person as $person) {
        $sort[] = $person;
}

function cmp($a, $b){
    if ((int)$a->age == (int)$b->age) {
        return 0;
    }
    return ((int)$a->age < (int)$b->age) ? -1 : 1;
}

даст вам правильный результат.

1 голос
/ 10 ноября 2011

Чтобы использовать usort, вам нужно преобразовать ваш SimpleXMLElement в массив. Вот быстрый способ сделать это (http://www.php.net/manual/en/book.simplexml.php#105330):

$xml = file_get_contents('admin/people.xml');
$x = new SimpleXMLElement($xml);
$json = json_encode($x);
$xml_array = json_decode($json,TRUE);
$sort = $xml_array['person'];

Теперь вы можете передать $sort в usort, и все будет работать нормально. Заменить $a->age на $a['age']

...