早上好,我对此感到有些震惊,但是php有10种以上的方法可以对数组进行排序,但是我找不到一种可以按所需键动态排序的方法。
我无法设置某些uksort,因为它会动态填充。我在前面使用了smarty(它没有数组排序功能),并且试图使一个可调用的static值在某个特定点上重新排序和打印排序后的数组。
我已经对其应用了一些逻辑,我想这会是这样。
聪明:
{assign var='key' value='category_id'}
{assign var='direction' value='normal'}
{assign var='sortedItem' value=''}
{foreach $object.prop item="item"}
{sortedItem = Class::arraySortBy($item, $key, $direction)}
<a href="{$item['link']}">
{$item['name']}
</a>
{foreach}
PHP:
public static function arraySortBy($elemGroup, $sortBy, $direction) {
if(is_object($elemGroup)){
$elemGroup = (array) $elemGroup;
}
if ($direction == 'normal') {
// here is where i want to sort the elemGroup array by the key i want, as the key is product_id and i want to sort by category_id
} else if ($direction == 'reverse'){
// here the same but in reverse order
} else {
error_log('Direction not properly set.');
}
return $elemGroup;
}
事实是我想重新排序对象bu category_id,其次是按product_id IE:
itemA{product_id=1, category_id=1}
itemB{product_id=2, category_id=2}
itemC{product_id=3, category_id=1}
itemE{product_id=4, category_id=1}
itemD{product_id=5, category_id=2}
结果:
itemA
itemB
itemC
itemE
itemD
预期结果
itemA
itemC
itemE
itemB
itemD
是否可以通过PHP排序功能实现此功能,或者必须将其自定义?
谢谢
答案 0 :(得分:1)
您为什么不能使用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;
}
这是通过首先比较category_id
字段来实现的。
如果这些相同,则我们比较product_id
。使用减法,以便将product_id
中较小的{em>之前排序为较大的。
如果category_id
不相同,则我们在category_id
上执行与上述product_id
相同的操作。
要在您的视图中实现此功能,请遵循以下documentation
$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
数组中添加另一个列名即可。
答案 1 :(得分:-1)
您可以尝试使用此功能。
function array_sort($array, $on, $order=SORT_ASC){
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch ($order) {
case SORT_ASC:
asort($sortable_array);
break;
case SORT_DESC:
arsort($sortable_array);
break;
}
foreach ($sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}
return $new_array;
}
示例:
数组值:-
$item_array = array (
'itemA' => array('product_id'=>1, 'category_id'=>1),
'itemB' => array('product_id'=>2, 'category_id'=>2),
'itemC' => array('product_id'=>3, 'category_id'=>1),
'itemD' => array('product_id'=>4, 'category_id'=>1),
'itemE' => array('product_id'=>5, 'category_id'=>2)
);
使用功能:-
$itme_list = array_sort($item_array, 'category_id', SORT_ASC);
print_r($itme_list);
输出:
Array
(
[itemA] => Array
(
[product_id] => 1
[category_id] => 1
)
[itemC] => Array
(
[product_id] => 3
[category_id] => 1
)
[itemD] => Array
(
[product_id] => 4
[category_id] => 1
)
[itemB] => Array
(
[product_id] => 2
[category_id] => 2
)
[itemE] => Array
(
[product_id] => 5
[category_id] => 2
)
)