У меня проблема, когда ни одно из моих значений не заканчивается в правильном порядке.
$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
принимает массив. Так измените код
$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']