Отсортировать двумерный ассоциативный массив.
Решил через сниппет up2Users вывести рейтинг пользователей и отсортировать по его убыванию. Рейтинг вывел, а вот при попытке сортировки проблема какая-то, кто может подсказать как лучше поступить?
Перезаписываю массив:
А потом пытаюсь его отсортировать через:
Перезаписываю массив:
foreach ($rows as $k => &$row) {
$currentuser=$modx->getObject('modUser', $row['id']);
$profiles=$currentuser->getOne('AuthorProfile');
$myrating =$profiles ->toArray();
$myrating =$myrating['rating'];
$row[]=array('myrating' => $myrating);
}
unset($row);
А потом пытаюсь его отсортировать через:
class isort {
private static $field;
private static function cmp($a, $b) {
$x = $a[self::$field];
$y = $b[self::$field];
return $x > $y ? 1 : ($x < $y ? -1 : 0);
}
public static function sort(array &$array, $field) {
self::$field = $field;
usort($array, array(__CLASS__, 'cmp'));
}
}
isort::sort($rows, 'myrating');
Сортировка не получается. У кого есть опыт с такой сортировкой, поделитесь:) Комментарии: 5
А что именно не получается? Ошибка или просто не сортирует?
Не сортирует. Точнее сортировка происходит, но несколько хаотично- не в нужном порядке. Смотрю массив
var_dump($rows);
. Сортировка хаотично выходит)
Вроде все правильно по коду, но есть подозрение, что выборка из БД отдает поле myrating как строку, а значит может работать не совсем правильно. Нужно приводить к типу integer в функции сравнения массива (cmp) перед сравнением.
class isort {
private static $field;
private static function cmp($a, $b) {
$x = $a[self::$field];
$y = $b[self::$field];
$x=(integer)$x;
$y=(integer)$y;
return $x > $y ? 1 : ($x < $y ? -1 : 0);
}
public static function sort(array &$array, $field) {
self::$field = $field;
usort($array, array(__CLASS__, 'cmp'));
}
}
isort::sort($rows, 'myrating');
Делал и float — что мне ближе, все равно тоже самое. Я не очень силен в ООП. Может ли влиять этот код, который идет до моей фильтрации и выводит:$userprofile2->pdoTools->addTime('Query parameters ready');
$userprofile2->pdoTools->setConfig(array_merge($default, $scriptProperties), false);
$rows = $userprofile2->pdoTools->run();
Но он идет «до». И уже этот вывод я пытаюсь фильтровать. Может чего я не понимаю))foreach ($rows as $k => &$row) {
$currentuser=$modx->getObject('modUser', $row['id']);
$profiles=$currentuser->getOne('AuthorProfile');
$myrating =$profiles ->toArray();
$myrating =$myrating['rating'];
$row[]=array('myrating' => $myrating);
// echo gettype($row[myrating]);
}
unset($row);
echo gettype($rows[0][myrating]);
сделал проверку типа. выдает Null, хотя print_r показывает это поле с нужным числом, ничего не понимаю.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.