我想做(喜欢)一个二维数组,不区分大小写。
我有:
foreach ($rows as $key=>$row) {
$names[$key]=$row['Name'];
}
array_multisort($rows,SORT_STRING|SORT_FLAG_CASE,$names);
以上最终产生相同的结果(带或不带大小写标志)。
厌倦了盯着这个,外面有人有什么想法吗?
我想做(喜欢)一个二维数组,不区分大小写。
我有:
foreach ($rows as $key=>$row) {
$names[$key]=$row['Name'];
}
array_multisort($rows,SORT_STRING|SORT_FLAG_CASE,$names);
以上最终产生相同的结果(带或不带大小写标志)。
厌倦了盯着这个,外面有人有什么想法吗?
首先,SORT_FLAG_CASE仅在 PHP v5.4+ 中可用,所以我建议检查您正在运行的 PHP 版本(如果5.3ish可能会有所帮助)。
如果不是,请确保您放入$names的所有值都是小写或大写。
您在对array_multisort的调用中颠倒了争论$rows和$names的顺序。
最后,如果它来自数据库(或其他方式,这意味着您不能在进入数组的过程中更改数据),那么您可以使用array_walk。
希望有帮助
由于我使用 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
(以摆脱日志消息)。
您还可以在排序中进行排序,因此可以将 usort 与 strcasecmp 一起使用:
foreach ($rows as $key=>$row) {
$names[$key]=row['Name'];
}
array_multisort(usort($names,strcasecmp),$rows);
上面的答案不起作用,因为第一个数组混合在一起,而另一个没有。所以我写了一个通用的多维数组不区分大小写的比较函数。它还可以使用多个键:
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 以使它们以正确的方式分开。