Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 排序一个";“内部”;仅按特定键值进行数组-使用uasort()?_Php_Arrays_Sorting - Fatal编程技术网

Php 排序一个";“内部”;仅按特定键值进行数组-使用uasort()?

Php 排序一个";“内部”;仅按特定键值进行数组-使用uasort()?,php,arrays,sorting,Php,Arrays,Sorting,PHP非常适合对数组进行排序,但我不知道在出现此问题时使用什么。。看看上面的数组 我想按perc-键从低到高对innersubcats[]数组进行排序 我希望结果是: Array opareas ( [0] => Array ( [name] = => array('opname1') [subcats] => Array ( [0] => Array ( [amount] => 98

PHP非常适合对数组进行排序,但我不知道在出现此问题时使用什么。。看看上面的数组

我想按
perc
-键从低到高对inner
subcats[]
数组进行排序

我希望结果是:

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
            )

    )

)
我已经试过了:

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什么意思{
私有函数排序子类perc($a,$b){
如果($a['subcats']['perc']=$b['subcats']['perc']){返回0;}
回报($a['subcats']['perc']<$b['subcats']['perc'])?-1:1;
}
公共功能showthing(){
$opareas=array();//如上所示
//根据perc键将子类别数组从低到高排序
uasort($opareas,array($this,'sort_subcats_perc'));
}
);
}
我不希望实际的
opareas[0]
operas[1]
在数组中切换位置(使用我尝试过的函数时会发生这种情况),我只希望内部数组子类[]根据perc字段/键更改其顺序。使用
uasort
是否可以这样做?还是其他内置的PHP优秀排序函数

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 = 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') );
}
foreach($opareas as&$value){
usort($value['subcats'),函数($a,$b){
如果($a['perc']>$b['perc'])返回1;
如果($a['perc']<$b['perc'])返回-1;
返回0;
});
}
未设置($value);//循环后取消设置引用

您可以使用
usort
。如果您关心
子类别中键的顺序,则只需使用
uasort
,如果您要对子数组进行排序,则比较函数需要稍有不同。然后,您可以通过引用在外部数组上循环,以便将
子类别
排序到位

$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') );
}
foreach($opareas as&$value){
usort($value['subcats'),函数($a,$b){
如果($a['perc']>$b['perc'])返回1;
如果($a['perc']<$b['perc'])返回-1;
返回0;
});
}
未设置($value);//循环后取消设置引用

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

我无法自行实现此功能。我得到了非法的stringset子类作为警告。这是因为这将
uasort
与您的
sort\u subcats\u perc
函数一起应用到第二级数组(使用键“name”和“subcats”)而不是最里面的数组。我无法让它单独工作。我得到了非法的stringset子类作为警告。这是因为这将
uasort
与您的
sort\u subcats\u perc
函数一起应用到第二级数组(使用键“name”和“subcats”)而不是最里面的数组。谢谢!工作得很有魅力!非常感谢。工作得很有魅力!