Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Есть ли альтернатива array_multisort?


Автор: teroni 7.6.2007, 16:15
Столкнулся с такой проблемкой...
Имеется вот такой массивчик:
Код

$user['posts']['admin'] = 30;
$user['posts'][111] = 40;
$user['posts']['Boy'] = 40;
$user['reputation']['admin'] = 100;
$user['reputation'][111] = 10;
$user['reputation']['Boy'] = 1;

На самом деле он конечно гораздо больше...
Сортирую массив по количеству сообщений:
Код

arsort ($user['posts']);
print_r($user['posts']);

На выходе вижу: Array ( [Boy] => 40 [111] => 40 [admin] => 30 )
Сортирую с учетом репутации:
Код

array_multisort($user['posts'], SORT_NUMERIC, SORT_DESC, $user['reputation'], SORT_NUMERIC, SORT_DESC);
echo "<pre>";
print_r($user);
echo "</pre>";

На выходе вижу: 
Код

Array
(
    [posts] => Array
        (
            [0] => 40
            [Boy] => 40
            [admin] => 30
        )

    [reputation] => Array
        (
            [0] => 10
            [Boy] => 1
            [admin] => 100
        )
)

На самом деле, таблица побольше, и сортирую не по двум, а иногда даже по 5 столбцам, но суть вроде бы описал.
Вопрос в том, почему при array_multisort строковые ключи сохраняются, а цифровые - превращаются в 0, 1, 2 и т. д.? И как сделать чтобы такого не было?

Автор: teroni 7.6.2007, 16:36
Сейчас проблему решаю добавлением к каждому ключу еще одного символа напр. 111 превращаю в а111, Boy - в аBoy - все работает как надо, но все-таки интересно - как правильно сделать!

Автор: WolfON 7.6.2007, 19:05
SORT_NUMERIC, ага

Автор: SelenIT 7.6.2007, 21:32
WolfON, к чему это?

teroni, можно изменить структуру хранения данных (имхо, так будет даже логичнее) и воспользоваться ф-цией uasort:
Код

$user = array(
    'admin' => array('posts'=>30, 'reputation' => 100),
    111 => array('posts'=>40, 'reputation' => 10),
    'Boy' => array('posts'=>40, 'reputation' => 1),

);

function cmp($a, $b) {
    if ($a['posts'] == $b['posts']) {
        return ($a['reputation'] > $b['reputation']) ? -1 : 1;
    }
    return ($a['posts'] > $b['posts']) ? -1 : 1;
}

uasort($user, 'cmp');

print_r($user);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)