【问题标题】:Sort an "inner" array ONLY by a specific keys value - with uasort()?仅按特定键值对“内部”数组进行排序 - 使用 uasort()?
【发布时间】:2015-12-10 23:35:17
【问题描述】:
Array opareas
(
[0] => Array
(
[name] = => array('opname1')

[subcats] => Array
    (
        [0] => Array
            (
                [amount] => 9883
                [perc] => 112.61394712853236
            )

        [1] => Array
            (
                [amount] => 1
                [perc] => 0.011394712853236098
            )

        [2] => Array
            (
                [amount] => 3679
                [perc] => 41.921148587055605
            )

    )

)

[1] => Array
(
[name] = => array('opname2')

[subcats] => Array
    (
        [0] => Array
            (
                [amount] => 12166
                [perc] => 56.8584380987989
            )

        [1] => Array
            (
                [amount] => 1473
                [perc] => 6.884142636818245
            )

        [2] => Array
            (
                [amount] => 955
                [perc] => 4.463242510632331
            )

        [3] => Array
            (
                [amount] => 6802
                [perc] => 31.789503201383372
            )

    )

)

PHP 非常适合对数组进行排序,但遇到此问题时我不知道该使用什么。请查看上面的数组。

我想通过perc-key 从低到高对内部subcats[] 数组进行排序。

我希望结果是:

Array opareas
(
[0] => Array
(
[name] = => array('opname1')

[subcats] => Array
    (
        [0] => Array
            (
                [amount] => 1
                [perc] => 0.011394712853236098 //Lowest percentage value
            )

        [1] => Array
            (
                [amount] => 3679
                [perc] => 41.921148587055605
            )

        [2] => Array
            (
                [amount] => 9883
                [perc] => 112.61394712853236 //Highest percentage value
            )

    )

)

[1] => Array
(
[name] = => array('opname2');

[subcats] => Array
    (
        [0] => Array
            (
                [amount] => 955
                [perc] => 4.463242510632331 //Lowest percentage value
            )

        [1] => Array
            (
                [amount] => 1473
                [perc] => 6.884142636818245
            )

        [2] => Array
            (
                [amount] => 12166
                [perc] => 56.8584380987989
            )

        [3] => Array
            (
                [amount] => 6802
                [perc] => 31.789503201383372 //Highest percentage value
            )

    )

)

我试过了:

class whateverArray {

    private function sort_subcats_perc($a, $b) {               
        if ($a['subcats']['perc'] == $b['subcats']['perc'] ) {return 0;}
        return ( $a['subcats']['perc'] < $b['subcats']['perc'] ) ? -1 : 1;
    }

    public function showStuff() {
       $opareas = array(); //Given above

       //Sort subcat array from low to high based on perc-key
       uasort( $opareas, array( $this, 'sort_subcats_perc') );
    }

 );

}

我不希望实际的 opareas[0]operas[1] 在数组中切换位置(使用我尝试过的函数时会发生什么),我只想要内部数组subcats[] 根据 perc-field/key 更改它的顺序。 uasort 可以做到这一点吗?还是其他PHP内置的优秀排序功能?

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    如果你想对子数组进行排序,你的比较函数需要有点不同。然后你可以通过引用循环外部数组,这样subcats就会被排序。

    foreach ($opareas as &$value) {
        usort($value['subcats'], function($a, $b) {
            if ($a['perc'] > $b['perc']) return 1;
            if ($a['perc'] < $b['perc']) return -1;
            return 0;
        });
    }
    unset($value); // unset the reference after looping
    

    您可以使用usort。如果您关心subcats 中键的顺序,则只需要使用uasort

    【讨论】:

    • 谢谢!像魅力一样工作!
    【解决方案2】:
    $opareas = array(); //Given above
    foreach($opareas as &$oparea){
     //Sort subcat array from low to high based on perc-key
     uasort( $oparea, array( $this, 'sort_subcats_perc') );
    }
    

    这里可以解决。

    【讨论】:

    • 我无法让它自己工作。我收到了非法字符串集子猫作为警告。
    • 这是因为这是将 uasort 与您的 sort_subcats_perc 函数一起应用于二级数组(使用键“name”和“subcats”)而不是最里面的数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多