1

我想做(喜欢)一个二维数组,不区分大小写。

我有:

foreach ($rows as $key=>$row) { 
    $names[$key]=$row['Name']; 
} 

array_multisort($rows,SORT_STRING|SORT_FLAG_CASE,$names);

以上最终产生相同的结果(带或不带大小写标志)。

厌倦了盯着这个,外面有人有什么想法吗?

4

4 回答 4

2

首先,SORT_FLAG_CASE仅在 PHP v5.4+ 中可用,所以我建议检查您正在运行的 PHP 版本(如果5.3ish可能会有所帮助)。

如果不是,请确保您放入$names的所有值都是小写或大写。

您在对array_multisort的调用中颠倒了争论$rows$names的顺序。

最后,如果它来自数据库(或其他方式,这意味着您不能在进入数组的过程中更改数据),那么您可以使用array_walk

希望有帮助

于 2013-01-27T20:44:32.410 回答
0

由于我使用 PHP 5.3.16 遇到了这个问题,我想我会分享我的简单解决方案:只需将您的密钥转换为小写(或大写),例如:

foreach ($rows as $key=>$row) { 
    $names[$key]=strtolower($row['Name']); 
} 

array_multisort($names,SORT_STRING,$rows);

我还交换了$rows&$names并删除了SORT_FLAG_CASE(以摆脱日志消息)。

于 2013-10-22T11:55:19.133 回答
0

您还可以在排序中进行排序,因此可以将 usort 与 strcasecmp 一起使用:

foreach ($rows as $key=>$row) { 
    $names[$key]=row['Name']; 
} 

array_multisort(usort($names,strcasecmp),$rows);
于 2016-08-14T09:05:24.477 回答
0

上面的答案不起作用,因为第一个数组混合在一起,而另一个没有。所以我写了一个通用的多维数组不区分大小写的比较函数。它还可以使用多个键:

function array_casecmp($keys) {
    if (gettype($keys) != "array") $keys = func_get_args();
    return function ($a, $b) use ($keys) {
        foreach($keys as $value) {
            $akeys = $akeys . $a[$value];
            $bkeys = $bkeys . $b[$value];
        }
        return strcasecmp($akeys, $bkeys);
    };
}

像这样使用它:

usort($files,strcasecmp(array(0,1)); // with standard array
usort($files,strcasecmp(1); // single key
usort($files,strcasecmp(0,1); // arguments are converted to array
usort($files,strcasecmp("dir","link")); // you can also use symbolic keys
usort($files,strcasecmp(0,1,2,3,4,...); // use as many keys as you like

请记住,键是连接的,因此您可能必须在数组列中使用 str_pad 以使它们以正确的方式分开。

于 2016-08-15T11:00:13.283 回答