仅使用特定键值对“内部”数组进行排序 - 使用uasort()?

时间:2015-12-10 23:35:17

标签: php arrays sorting

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非常适合排序数组,但我无法弄清楚在遇到这个问题时要使用什么。看看上面的数组。

我希望通过subcats[] - 从较低到较高的键对$ {1}}数组进行排序。

我希望结果是:

perc

我试过这个:

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]切换位置(在使用我尝试过的函数时会发生什么),我只是想要内部数组子句[]根据perc-field / key改变它的顺序。这可能是operas[1]吗?或者任何其他内置的PHP优秀的排序功能?

2 个答案:

答案 0 :(得分:2)

如果要对子数组进行排序,则比较函数需要稍微不同。然后,您可以通过引用循环遍历外部数组,以便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。如果您关心uasort中密钥的顺序,则只需使用subcats

答案 1 :(得分:1)

$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') );
}

可以是这里的解决方案。