Почему вы не можете использовать uasort
?
function custom_array_sort($arr, $sorts)
{
// Either pass an array of sorts, or every argument after the first one.
$sorts = is_array($sorts) ? $sorts : array_slice(func_get_args(), 1);
uasort($arr, function ($a, $b) use (&$arr, $sorts) {
for ($i = 0; $i < count($sorts); $i++) {
if ($a[$sorts[$i]] == $b[$sorts[$i]]) {
if (isset($sorts[$i + 1])) {
$arr = custom_array_sort($arr, array_slice($sorts, 1));
} else {
return 0;
}
} else {
return $a[$sorts[$i]] - $b[$sorts[$i]];
}
}
});
return $arr;
}
Live демо
Это работает при первом сравнении category_id
fields.
Если они совпадают, то мы сравниваем product_id
.Вычитание используется для того, чтобы меньшее из product_id
s сортировалось перед , чем большее.
Если category_id
s не совпадают, то мы выполняем ту же операцию наcategory_id
s, как мы делали выше для product_id
.
Чтобы реализовать это на ваш взгляд, следуйте этой документации
$smarty->register_function('custom_array_sort', 'custom_array_sort_wrapper');
function custom_array_sort_wrapper($params, &$smarty)
{
if (empty($params['arr'])) {
$arr = [];
} else {
$arr = $params['arr'];
}
if (empty($params['sorts'])) {
$sorts = [];
} else {
$sorts = $params['sorts'];
}
return custom_array_sort($arr, $sorts);
}
Это можетзатем использовать их в своих представлениях следующим образом:
{custom_array_sort arr=$object sorts=['category_id', 'product_id']}
Преимущество этой новой реализации заключается в том, что вы можете указать столько столбцов для сортировки, сколько хотите.
Это также означает, что вы можете указатьразные столбцы для сортировки по различным массивам.
Если вы хотите отсортировать по нескольким столбцам, просто добавьте другое имя столбца в массив $sorts
.