如何对多维数组进行排序。这就是我的数组的样子
[0] => Array
(
[id] => 1
[title] => 3A
[active] => 1
)
[1] => Array
(
[id] => 1
[title] => A
[active] => 1
)
[2] => Array
(
[id] => 1
[title] => 2A
[active] => 1
)
[3] => Array
(
[id] => 1
[title] => B
[active] => 1
)
我已经尝试了几种usort方法,但似乎无法使其工作。我需要对数组进行排序,以便按数字排序,然后按字母数字排序,如:A,B,2A,3A。 我不确定如果没有添加一个位置字段来指示标题所假设的顺序,或者我在这里遗漏了什么,我是否可以这样做?
答案 0 :(得分:1)
你可以建立一个"密钥"对于数字部分在左边用0填充的每个项目,这样,sort函数可以执行简单的字符串比较:
a
此技术称为" Schwartzian Transform"。
答案 1 :(得分:0)
正如@Kargfen所说,你可以使用usort和你的自定义功能。像这样:
usort($array, function(array $itemA, array $itemB) {
return myCustomCmp($itemA['title'], $itemB['title']);
});
function myCustomCmp($titleA, $titleB) {
$firstLetterA = substr($titleA, 0, 1);
$firstLetterB = substr($titleB, 0, 1);
//Compare letter with letter or number with number -> use classic sort
if((is_numeric($firstLetterA) && is_numeric($firstLetterB)) ||
(!is_numeric($firstLetterA) && !is_numeric($firstLetterB)) ||
($firstLetterA === $firstLetterB)
) {
return strcmp($firstLetterA, $firstLetterB);
}
//Letters first, numbers after
if(! is_numeric($firstLetterA)) {
return -1;
}
return 1;
}
这个比较功能只是基于你的标题的第一个字母,但它可以完成这项工作; - )
答案 2 :(得分:0)
您可以通过usort和自定义回调来解决该问题:
function customSort($a, $b)
{
if ($a['id'] == $b['id']) {
//if there is no number at the beginning of the title, I add '1' to temporary variable
$aTitle = is_numeric($a['title'][0]) ? $a['title'] : ('1' . $a['title']);
$bTitle = is_numeric($b['title'][0]) ? $b['title'] : ('1' . $b['title']);
if ($aTitle != $bTitle) {
return ($aTitle < $bTitle) ? -1 : 1;
}
return 0;
}
return ($a['id'] < $b['id']) ? -1 : 1;
}
usort($array, "customSort");
首先,该功能会比较&#39; id&#39;值,然后如果两个项目相等,则检查标题&#39;值。