PHP对象通过关联键对数组排序

时间:2019-02-28 11:34:48

标签: php smarty

早上好,我对此感到有些震惊,但是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排序功能实现此功能,或者必须将其自定义?

谢谢

2 个答案:

答案 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;
}

Live demo

这是通过首先比较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
        )

)

注意:参考链接:- Sort PHP multi-dimensional array based on key?

How to sort multidimensional array by multiply keys?