array_multisort и неизвестное количество входящих параметров

Vallium

Профессор
Регистрация
22 Авг 2014
Сообщения
225
Реакции
46
Как можно организовать сабж? Т.е. заранее неизвестно по какому количеству полей нужно сортировать
 
func_get_args + call_user_func, если я правильно понял
 
Что-то не разобрался...
есть массив:
PHP:
[pr] => Array (
[0] => Array ( [pr_id] => 365 [v_height] => 1.20 [v_width] => 1200.00 [v_length] => 3000.00 [v_l1] => 20 [v_l2] => 50 )
[1] => Array ( [pr_id] => 436 [v_height] => 4.00 [v_width] => 1200.00 [v_length] => 3000.00 [v_l1] => 90 )
[2] => Array ( [pr_id] => 367 [v_height] => 0.50 [v_width] => 1200.00 [v_length] => 3000.00)
[3] => Array ( [pr_id] => 769 [v_height] => 0.50 [v_width] => 1200.00 [v_length] => 3000.00 [v_l3] => 12 )
[4] => Array ( [pr_id] => 770 [v_height] => 0.80 [v_width] => 1200.00 [v_length] => 3000.00)
)
нужна сортировка по приоритету [v_height],[v_width],[v_length],[v_l1],[v_l2]...[v_lN]
как организовать если количество v_lN величина переменная?
 
Последнее редактирование модератором:
  • Заблокирован
  • #4
используя array_keys, получаем все ключи, проверим и уже отсортировать
 
v_lN ничем не ограничен? Какое максимальное количество их может быть?
 
v_lN ничем не ограничен? Какое максимальное количество их может быть?
теоретически ничем, но не думаю что их будет больше 20

используя array_keys, получаем все ключи, проверим и уже отсортировать
вопрос в том как передать все ключи в сортировку
 
Последнее редактирование модератором:
Даже если ты передашь все ключи в array_multisort - будет ошибка: "Array sizes are inconsistent"
Т.к. собственно вложенные массивы у тебя разных размеров.
Можно нагородить такой огород, чтобы использовался шаблон массива для заполнения, что-то типа

PHP:
$aDataTemplate  = array(
                    'pr_id' => 0,
                    'v_height' => 0,
                    'v_width' => 0.0,
                    'v_length' => 0.0,
                    'v_l1' => 0,
                    'v_l1' => 0,
                    'v_l2' => 0,
                    'v_l3' => 0,
                    .............
                    'v_l20' => 0,
);

При наполнении твоего массива с данными используй его как шаблон, тогда вложенные массивы у тебя будут одного размера.
Так же у тебя будет заранее определен набор ключей, которые ты можешь передать в array_multisort для сортировки.
 
Даже если ты передашь все ключи в array_multisort - будет ошибка: "Array sizes are inconsistent"
Т.к. собственно вложенные массивы у тебя разных размеров.
Можно нагородить такой огород, чтобы использовался шаблон массива для заполнения, что-то типа
При наполнении твоего массива с данными используй его как шаблон, тогда вложенные массивы у тебя будут одного размера.
Так же у тебя будет заранее определен набор ключей, которые ты можешь передать в array_multisort для сортировки.
Такой вариант я уже опробовал, просто думал есть более изящное решение...
 
  • Заблокирован
  • #9
вопрос в том как передать все ключи в сортировку
эелементарно Ватсон
Код:
$a = array([pr] => Array (
[0] => Array ( [pr_id] => 365 [v_height] => 1.20 [v_width] => 1200.00 [v_length] => 3000.00 [v_l1] => 20 [v_l2] => 50 )
[1] => Array ( [pr_id] => 436 [v_height] => 4.00 [v_width] => 1200.00 [v_length] => 3000.00 [v_l1] => 90 )
[2] => Array ( [pr_id] => 367 [v_height] => 0.50 [v_width] => 1200.00 [v_length] => 3000.00)
[3] => Array ( [pr_id] => 769 [v_height] => 0.50 [v_width] => 1200.00 [v_length] => 3000.00 [v_l3] => 12 )
[4] => Array ( [pr_id] => 770 [v_height] => 0.80 [v_width] => 1200.00 [v_length] => 3000.00)
)
$r=array();
$o = array();
foreach ($a as $key=>$val){
 $r[]=array_keys($val);
 $m=$r[(count($r)-1)][(count($r[(count($r)-1)])-1)];
 if(is_numeric(strstr($m,'v_l')) && strstr($m,'v_l')>$o){
    $o[]=strstr($m,'v_l')+0;
  }else{
    $o[]=0;
  }
}
имеем массив с ключами $r, массив $o с последними ключами типа v_l
а дальше выбираем сортировку хот пузырьком, хоть шатл и спокойно сортируем как душе угодно
 
  • Заблокирован
  • #10
можно еще даже дозаполнить пустые значения v_lх нулями, так будет еще проще
 
Назад
Сверху