Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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
如何使用usort按多个字段对php数组排序_Php_Mysql_Php 5.4 - Fatal编程技术网

如何使用usort按多个字段对php数组排序

如何使用usort按多个字段对php数组排序,php,mysql,php-5.4,Php,Mysql,Php 5.4,这里我按1个字段排序,如何添加更多字段来排序?就像Mysql中的按字段1、字段2、字段3排序一样{ usort($childs, function($a, $b) { return $a['parent_id'] - $b['parent_id']; }); 如果($a['field1']=$b['field1'])){ 如果($a['field2']=$b['field2'])){ 返回$a['field3']'asc'); usort($childs,function($a,$b)

这里我按1个字段排序,如何添加更多字段来排序?就像Mysql中的
按字段1、字段2、字段3排序一样{
usort($childs, function($a, $b) {
    return $a['parent_id'] - $b['parent_id'];
});
如果($a['field1']=$b['field1'])){ 如果($a['field2']=$b['field2'])){ 返回$a['field3']<$b['field3']?-1:1; }否则{ 返回0; } 返回$a['field2']<$b['field2']?-1:1; } 返回$a['field1']<$b['field1']?-1:1; });
编辑

更通用的解决方案(未经测试)

$sorts=array('field1'=>'asc','field2'=>'asc','field3'=>'asc');
usort($childs,function($a,$b)使用(数组$sorts=array()){
foreach($field=>$direction排序){
如果($a[$field]!=$b[$field]){
如果($direction==“asc”){
返回$a[$field]<$b[$field]?-1:1;
}
返回$a[$field]<$b[$field]?1:-1;
}
}
返回0;
});
usort($childs,function($a,$b){
如果($a['field1']=$b['field1'])){
如果($a['field2']=$b['field2'])){
返回$a['field3']<$b['field3']?-1:1;
}否则{
返回0;
}
返回$a['field2']<$b['field2']?-1:1;
}
返回$a['field1']<$b['field1']?-1:1;
});
编辑

更通用的解决方案(未经测试)

$sorts=array('field1'=>'asc','field2'=>'asc','field3'=>'asc');
usort($childs,function($a,$b)使用(数组$sorts=array()){
foreach($field=>$direction排序){
如果($a[$field]!=$b[$field]){
如果($direction==“asc”){
返回$a[$field]<$b[$field]?-1:1;
}
返回$a[$field]<$b[$field]?1:-1;
}
}
返回0;
});

这可能会透露一些信息这可能会透露一些信息如果($a[1]!=$b[1])返回。。。;如果($a[2]!=$b[2])返回…更具可读性…?:)为什么附加逻辑而不仅仅是
返回$a[…]-$b[…]?@deceze-可能,只是尝试使用usort()而不是array_multisort()提供OP问题的字面答案。。。。并通过
use
将数组(['field1'=>'asc','field2'=>'asc','field3'=>'asc'])传入,使其更通用。。。虽然我不确定自己是否有时间在此时做出这样的努力,特别是在
usort
回调中,但我不会使用这种右缩进嵌套
if
样式。另外,如果要比较数字,
$a-$b
可以返回<0、0和>0。对于字符串,我将使用strcmp
strcmp
,它实现了同样的功能。还可以看到是的,strcmp在比较字符串方面肯定更好,当您知道它们是字符串时,
if($a[1]!=$b[1])返回。。。;如果($a[2]!=$b[2])返回…
更具可读性…?:)为什么附加逻辑而不仅仅是
返回$a[…]-$b[…]?@deceze-可能,只是尝试使用usort()而不是array_multisort()提供OP问题的字面答案。。。。并通过
use
将数组(['field1'=>'asc','field2'=>'asc','field3'=>'asc'])传入,使其更通用。。。虽然我不确定自己是否有时间在此时做出这样的努力,特别是在
usort
回调中,但我不会使用这种右缩进嵌套
if
样式。另外,如果要比较数字,
$a-$b
可以返回<0、0和>0。对于字符串,我将使用strcmp
strcmp
,它实现了同样的功能。也请看是的,strcmp在比较字符串方面肯定更好,当您知道它们是字符串时
usort($childs, function($a, $b) {
    if ($a['field1'] == $b['field1']) {
        if ($a['field2'] == $b['field2']) {
            return $a['field3'] < $b['field3'] ? -1 : 1;
        } else {
            return 0;
        }
        return $a['field2'] < $b['field2'] ? -1 : 1;
    }
    return $a['field1'] < $b['field1'] ? -1 : 1;
});
$sorts = array('field1' => 'asc', 'field2' => 'asc', 'field3' => 'asc');

usort($childs, function($a, $b) use (array $sorts = array()) {
    foreach($sorts as $field => $direction) {
        if ($a[$field] != $b[$field]) {
            if ($direction == 'asc') {
                return $a[$field] < $b[$field] ? -1 : 1;
            }
            return $a[$field] < $b[$field] ? 1 : -1;
        }
    }
    return 0;
});