Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.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 使用usort对多维数组排序_Php_Usort - Fatal编程技术网

Php 使用usort对多维数组排序

Php 使用usort对多维数组排序,php,usort,Php,Usort,以下usort函数并不总是给出正确的结果,因为它只会相对于比较项目向上或向下“推”一个位置。因此,当多次执行排序时,可能会出现结果Yes No Yes No 函数已成功对字段b进行排序 我怎样才能解决这个问题 排列 当前函数 function sortAnserDesc($x, $y){ if ( $x['a'] == $y['a'] ) return 0; else if ( $x['a'] < $y['a'] ) return 1; else

以下usort函数并不总是给出正确的结果,因为它只会相对于比较项目向上或向下“推”一个位置。因此,当多次执行排序时,可能会出现结果
Yes No Yes No

函数已成功对字段b进行排序

我怎样才能解决这个问题

排列

当前函数

function sortAnserDesc($x, $y){
    if ( $x['a'] == $y['a'] )
     return 0;
    else if ( $x['a'] < $y['a'] )
     return 1;
    else
     return -1;
}
函数sortAnserDesc($x,$y){
如果($x['a']=$y['a'])
返回0;
如果($x['a']<$y['a']),则为其他情况
返回1;
其他的
返回-1;
}

我发现了一个非常好的函数 我认为你有一个普遍的问题

我尝试在这里显示usort的回调函数

 function usortByArrayKey($key, $asc=SORT_ASC) {
    $sort_flags = array(SORT_ASC, SORT_DESC);

    if (!in_array($asc, $sort_flags))
        throw new InvalidArgumentException('sort flag only accepts SORT_ASC or SORT_DESC');

    return function(array $a, array $b) use ($key, $asc, $sort_flags) {
                if (!is_array($key)) { //just one key and sort direction
                    if (!isset($a[$key]) || !isset($b[$key])) {
                        throw new Exception('attempting to sort on non-existent keys');
                    }
                    if ($a[$key] == $b[$key])
                        return 0;
                    return ($asc == SORT_ASC xor $a[$key] < $b[$key]) ? 1 : -1;
                } else { //using multiple keys for sort and sub-sort
                    foreach ($key as $sub_key => $sub_asc) {
                        //array can come as 'sort_key'=>SORT_ASC|SORT_DESC or just 'sort_key', so need to detect which
                        if (!in_array($sub_asc, $sort_flags)) {
                            $sub_key = $sub_asc;
                            $sub_asc = $asc;
                        }
                        //just like above, except 'continue' in place of return 0
                        if (!isset($a[$sub_key]) || !isset($b[$sub_key])) {
                            throw new Exception('attempting to sort on non-existent keys');
                        }
                        if ($a[$sub_key] == $b[$sub_key])
                            continue;
                        return ($sub_asc == SORT_ASC xor $a[$sub_key] < $b[$sub_key]) ? 1 : -1;
                    }
                    return 0;
                }
            };
}
函数usortByArrayKey($key,$asc=SORT\u asc){
$sort\u flags=数组(sort\u ASC,sort\u DESC);
if(!in_数组($asc,$sort_标志))
抛出新的InvalidArgumentException('排序标志仅接受排序ASC或排序描述');
返回函数(数组$a、数组$b)使用($key、$asc、$sort\u标志){
如果(!is_array($key)){//只有一个键和排序方向
如果(!isset($a[$key])| |!isset($b[$key])){
抛出新异常(“尝试对不存在的键进行排序”);
}
如果($a[$key]==b[$key])
返回0;
返回($asc==SORT\u asc xor$a[$key]<$b[$key])?1:-1;
}else{//使用多个键进行排序和子排序
foreach($sub_key=>$sub_asc){
//数组可以是'sort_key'=>sort_ASC | sort_DESC或只是'sort_key',所以需要检测哪个
if(!in_数组($sub_asc,$sort_标志)){
$sub_key=$sub_asc;
$sub_asc=$asc;
}
//与上面一样,除了“continue”代替返回0
if(!isset($a[$sub_-key])| |!isset($b[$sub_-key])){
抛出新异常(“尝试对不存在的键进行排序”);
}
如果($a[$sub_键]==b[$sub_键])
持续
返回($sub_asc==SORT_asc xor$a[$sub_key]<$b[$sub_key])?1:-1;
}
返回0;
}
};
}
要与您的代码集成,您可能需要:

  • 仅通过降序排序
    a

    usort($YOUR_ARRAY,usortByArrayKey('a',SORT_DESC))

  • 排序
    a
    b

    usort($YOUR_数组,usortByArrayKey(数组('a','b')))

  • 有关按降序排序
    a
    b
    的详细信息

    usort($YOUR_数组,usortByArrayKey(数组('a','b')),SORT_DESC)


  • 希望这有帮助

    为什么不直接使用函数

    function sortAnserDesc($x, $y){
        return strcmp($x['a'],$y['a']);
    }
    

    生成解析错误:语法错误,第100行/file.php中意外的T_函数我忘了说,这只适用于PHP5.3.x。你的PHP版本是什么?我无法重现你所说的。对我来说,这很有效。您使用的PHP版本是什么?如何调用usort函数?我手动编写了数组,您应该能够在对6+个包含“是”或“否”的字段进行排序时重现错误。
    function sortAnserDesc($x, $y){
        return strcmp($x['a'],$y['a']);
    }