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

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

$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 

Есть идеи?

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

  • usort принимает массив.
  • Когда вы сравниваете два SimpleXMLElements, их следует отбрасывать.

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

 $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; } 

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

Чтобы использовать 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']