Php 使用usort对多维数组排序
以下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
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']);
}