PHP uksort无法排序

时间:2016-02-10 10:53:00

标签: php arrays sorting

我有一个数组数组,我想按键排序,所以我尝试使用uksort,但结果数组根本没有排序...不确定我在这里缺少什么。我在我的自定义排序器中使用strcmp,它似乎产生了正确的结果,但最终的数组并没有完全排序。

这是相关的一段代码,我在排序之前和之后打印出数组:

echo "Before sort<br/>";
foreach($rowsByTemas as $r=>$row) {
    echo ("Name:".$r."<br/>");
}
echo "<br/>";

uksort($rowsByTemas, "myTemasSorter");

echo "<br/>After sort<br/>";
foreach($rowsByTemas as $r=>$row) {
    echo ("Name:".$r."<br/>");
}

这是我的自定义排序器(我删除了一些与此示例无关的元素,如果您想知道我为什么不使用kso​​rt):

function myTemasSorter($a, $b) {
    echo "comparing $a with $b<br/>";
    $result=strcmp($a, $b);
    echo "result: $result<br/>";
}

结果如下:

Before sort
Name:05 COMPETIDORES TAX ACCOUNTING
Name:04 COMPETIDORES LEGAL REGULATORY
Name:02 LEGAL REGULATORY
Name:01 CORPORATIVO
Name:03 TAX ACCOUNTING

comparing 02 LEGAL REGULATORY with 04 COMPETIDORES LEGAL REGULATORY
result: -512
comparing 03 TAX ACCOUNTING with 02 LEGAL REGULATORY
result: 256
comparing 02 LEGAL REGULATORY with 05 COMPETIDORES TAX ACCOUNTING
result: -768
comparing 01 CORPORATIVO with 02 LEGAL REGULATORY
result: -256
comparing 03 TAX ACCOUNTING with 01 CORPORATIVO
result: 512
comparing 04 COMPETIDORES LEGAL REGULATORY with 05 COMPETIDORES TAX ACCOUNTING
result: -256

After sort
Name:03 TAX ACCOUNTING
Name:01 CORPORATIVO
Name:02 LEGAL REGULATORY
Name:04 COMPETIDORES LEGAL REGULATORY
Name:05 COMPETIDORES TAX ACCOUNTING

当我用ksort运行相同的东西时,结果是正确的,但是我不能包含我的自定义排序规则......

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

神圣的废话,我刚刚意识到我做错了什么......我没有在自定义分拣机功能中返回$ result。

所以它需要:

function myTemasSorter($a, $b) {
    echo "comparing $a with $b<br/>";
    $result=strcmp($a, $b);
    echo "result: $result<br/>";
    return $result;
}

这似乎解决了这个问题...

答案 1 :(得分:0)

仔细阅读documentation

  

<强> key_compare_func

     

如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。

您的比较功能不会返回任何内容。解释器将返回的结果(没有,即NULL)转换为整数并得到零。根据您的比较函数,数组中的所有键都相等。在这种情况下uksort()的结果取决于它的实现方式(排序是否稳定)。