Как задать направление сортировки call_user_func_array('array_mu ltisort', $params); ?

Single074

Новичок
Есть такая проблемма, пытаюсь отсортировать многомерный массив с помощью array_multisort, но так как колличество параметров не известно то использую call_user_func_array('array_mu ltisort', $params);
Сортировка проходит, все хорошо, но не получается задать направления (SORT_ASC,SORT_DESC). Т.е. если $params[1] идет типа string, то он просит дать ему "array or a sort flag". Причем массив должен быть той же мерности, что и массивы данных, иначе ругается ( Array sizes are inconsistent). Но если дать ему массив той же мерности, то ошибок нет, но и напраления сортировки тоже нет.
Собственно вопрос, как таки задать напраление сортировки с помощью аргумента для вызова через call_user_func_array('array_mu ltisort', $params); ?

PHP:
function get_fields($data, $order_by) {
    $order_row = preg_split("/[\s,]+/", $order_by);
    for ($i=0;$i<count($order_row);$i++) {
        foreach ($data as $key => $row) {
          $tmp[$i][$key]  = $row[$order_row[$i]];      
        }
    }
    return $tmp;
}

function ordering($data, $order_by) {
    $tmp = get_fields($data, $order_by);
    $params = array();
    foreach($tmp as &$t){
        $params[] = &$t;
    }

    $params[1] = array("SORT_DESC","SORT_DESC","SORT_DESC","SORT_DESC"); // like that no warning but no sorting

    $params[] = &$data;
    call_user_func_array('array_multisort', $params);
    return array_pop($params);
}

$data = array (
    array('id' => 1,'name' => 'Barack','city' => 9),
    array('id' => 7,'name' => 'boris','city' => 2),
    array('id' => 3,'name' => 'coris','city' => 2),
    array('id' => 3,'name' => 'coris','city' => 2)
);

$order_by = "city desc, name";

echo "<br>ORDER BY $order_by<br>";
$ordered = ordering($data, $order_by);
echo "<pre>";
var_dump($ordered);
echo "</pre>";
 

~WR~

Новичок
Пальцем в небо: константы должны быть без кавычек.
PHP:
$params[1] = array(SORT_DESC, SORT_DESC, SORT_DESC, SORT_DESC);
 

cDLEON

Онанист РНРСlub
Так а зачем вы в $params[1] пихаете строки? Там же используются константы.
 

Single074

Новичок
Так а зачем вы в $params[1] пихаете строки? Там же используются константы.
define($params[1], "SORT_DESC"); попробовал так, не помогло

Пальцем в небо: константы должны быть без кавычек.
PHP:
$params[1] = array(SORT_DESC, SORT_DESC, SORT_DESC, SORT_DESC);
нет, так тоже не получится
 

itprog

Cruftsman
дальше вопрос что $params[1] = array("SORT_DESC","SORT_DESC","SORT_DESC","SORT_DESC"); вообще такое? Как вы ожидаете оно будет работать без call_user_func_array?
 

Single074

Новичок
дальше вопрос что $params[1] = array("SORT_DESC","SORT_DESC","SORT_DESC","SORT_DESC"); вообще такое? Как вы ожидаете оно будет работать без call_user_func_array?
Вообще $params это список аргументов для array_multisort, а на месте $params[1] должен быть флаг, который будет говорить как сортировать массив в $params[0]. Здесь $params[1] = array("SORT_DESC","SORT_DESC","SORT_DESC","SORT_DESC"); представлено для наглядности, задача как раз преобразовать эту строку так, что бы направление сортировки заработало
 

С.

Продвинутый новичок
Что вообще за бессмысленный кусок?
PHP:
    $params = array();
    foreach($tmp as &$t){
        $params[] = &$t;
    }

    $params[1] = array("SORT_DESC","SORT_DESC","SORT_DESC","SORT_DESC"); // like that no warning but no sorting

    $params[] = &$data;
    call_user_func_array('array_multisort', $params);
 

fixxxer

К.О.
Партнер клуба
Я так понимаю, нужно как тут http://ru2.php.net/array_multisort в примере 3?
Ну так и составь массив, как там предлагают, в цикле. Поставь var_dump($params) и делай пока не получится как надо. Разумеется, константы не в кавычках.
 

Single074

Новичок
Что вообще за бессмысленный кусок?
PHP:
    $params = array();
    foreach($tmp as &$t){
        $params[] = &$t;
    }

    $params[1] = array("SORT_DESC","SORT_DESC","SORT_DESC","SORT_DESC"); // like that no warning but no sorting

    $params[] = &$data;
    call_user_func_array('array_multisort', $params);
Попробуйте запустить без него и думаю сразу все сами поймете

Я так понимаю, нужно как тут http://ru2.php.net/array_multisort в примере 3?
Ну так и составь массив, как там предлагают, в цикле. Поставь var_dump($params) и делай пока не получится как надо. Разумеется, константы не в кавычках.
Да, вы совершенно правы, что нужен результат как в примере 3. Однако, заранее не известно, по каким параметрам будет сортировка и в каком направлении. Пользователь передает лишь строку "city desc, name" и на основе ее я должен сортировать. Поэтому я вызываю call_user_func_array('array_multisort', $params); вместо array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
 

fixxxer

К.О.
Партнер клуба
Я понимаю, вот код, который генерирует $params из строки вида "city desc, name", и надо отладить.
http://phpfaq.ru/debug

для начала - я попробовал запустить, выдает

Notice: Undefined index: desc in /Users/fixxxer/tmp/1.php on line 6

значит уже фигня.

Ставим перед call_user_func_array var_dump($params) и добиваемся, чтобы получилось что надо.
 

Single074

Новичок
Я загрузил файл, на всякий случай. У меня таких ошибок не наблюдается. И да, я вардампил $params в поисках нужного значения, но удача сегодня не на моей стороне...
 

Вложения

Сверху