Есть многомерный массив, сформированный из запроса базы данных
в верхнем уровне, ключем является целое число, например инкрементное значение (постИД/тридИД/форумИД и т.д...)
значением ключа, является еще один массив с набором полей и их значений
вобщем это примерно выглядит так
Code:
Array
(
[13] => Array
(
[threadid] => 13
[price] => 15500
[votenum] => 10
[title] => abcde
)
[301] => Array
(
[threadid] => 301
[price] => 16700
[votenum] => 7
[title] => cdefgh
)
[467] => Array
(
[threadid] => 467
[price] => 10700
[votenum] => 3
[title] => acdru
)
[112] => Array
(
[threadid] => 112
[price] => 5700
[votenum] => 6
[title] => bcdee
)
[6811] => Array
(
[threadid] => 6811
[price] => 17700
[votenum] => 8
[title] => dewwq
)
)
в цикле
while() в массив добавлено свое поле (price), которого нет в таблице БД, соотв. в SQL запросе нельзя отсортировать по этому полю
каждое такое поле ассоциировано с ID темы (не буду описывать как, это из другой оперы
)
задача минимум: отсортировать значения в массиве по этому полю в порядке убывания
задача медиум: отсортировать значения в массиве по любому, указанному пользователем полю, в указанном же пользователем порядке (ASC/DESC)
задача максимум: отсортировать значения в массиве по нескольким полям указанным пользователем в указанном же пользователем порядке (ASC/DESC) для каждого поля
важно! сохранить значения ключей верхнего уровня (да и остальные тоже)
пытался использовать функцию
array_multisort() но она криво работает =\
конкретно, пересчитывает индексы (значения ключей верхнего уровня), если ключ - целое число, со строкой все в порядке, ключи не изменяет
ну и собсно к чему пришел (задача медиум выполнена)...
вот такая функция получилась
PHP Code:
/*
$array - Array
$order_by - String - sort field
$reverse - reverse order - Bool true/false
return - sorted Array
*/
function kr_array_orderby($array, $order_by, $reverse = false)
{
$hash = array();
foreach($array AS $key => $fields)
{
$hash["$key"] = $fields[$order_by];
}
($reverse) ? arsort($hash) : asort($hash);
$sorted = array();
foreach($hash AS $key => $val)
{
$sorted["$key"] = $array[$key];
}
return $sorted;
}
использование
исходный массив (может быть сформирован как из БД, так и другими способами, например парсинг текст. файла и сбор информации в массив)
PHP Code:
$array = array(
13 => array(
'threadid' => 13, 'price' => 15500, 'votenum' => 10, 'title' => 'abcde'
),
301 => array(
'threadid' => 301, 'price' => 16700, 'votenum' => 7, 'title' => 'cdefgh'
),
467 => array(
'threadid' => 467, 'price' => 10700, 'votenum' => 3, 'title' => 'acdru'
),
112 => array(
'threadid' => 112, 'price' => 5700, 'votenum' => 6, 'title' => 'bcdee'
),
6811 => array(
'threadid' => 6811, 'price' => 17700, 'votenum' => 8, 'title' => 'dewwq'
),
);
// сортируем по полю price с реверсом сортировки (по убыванию)
$array = kr_array_orderby($array, 'price', true);
результат после обработки
Code:
Array
(
[6811] => Array
(
[threadid] => 6811
[price] => 17700
[votenum] => 8
[title] => dewwq
)
[301] => Array
(
[threadid] => 301
[price] => 16700
[votenum] => 7
[title] => cdefgh
)
[13] => Array
(
[threadid] => 13
[price] => 15500
[votenum] => 10
[title] => abcde
)
[467] => Array
(
[threadid] => 467
[price] => 10700
[votenum] => 3
[title] => acdru
)
[112] => Array
(
[threadid] => 112
[price] => 5700
[votenum] => 6
[title] => bcdee
)
)
сортировать можно по любому полю, в том числе и по строковому (title к примеру), в любом порядке
если передаваемый в качестве второго аргумента ключ (поле) отсутствует в массиве, будет отсортировано по ключу верхнего уровня
ну и собсно вопрос, может у кого то есть более элегантное/универсальное решение?
т.к. более "глубокие" массивы этой функцией не обработать, либо нужно прогонять в циклах, а это ресурсы =\