Отсортировать двумерный ассоциативный массив.

Решил через сниппет 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');
Сортировка не получается. У кого есть опыт с такой сортировкой, поделитесь:)
Сергей
10 июля 2015, 21:53
modx.pro
933
0

Комментарии: 5

Іван Клімчук
11 июля 2015, 18:10
0
А что именно не получается? Ошибка или просто не сортирует?
    Сергей
    11 июля 2015, 19:16
    0
    Не сортирует. Точнее сортировка происходит, но несколько хаотично- не в нужном порядке. Смотрю массив
    var_dump($rows);
    . Сортировка хаотично выходит)
      Іван Клімчук
      11 июля 2015, 19:19
      +1
      Вроде все правильно по коду, но есть подозрение, что выборка из БД отдает поле myrating как строку, а значит может работать не совсем правильно. Нужно приводить к типу integer в функции сравнения массива (cmp) перед сравнением.
        Сергей
        12 июля 2015, 14:00
        0
        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();
        Но он идет «до». И уже этот вывод я пытаюсь фильтровать. Может чего я не понимаю))
    Сергей
    12 июля 2015, 14:35
    0
    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 показывает это поле с нужным числом, ничего не понимаю.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5