我正在使用自定义排序功能,我使用的是:
function cmp($wert_a, $wert_b) {
$a = $wert_a["name"];
$b = $wert_b["name"];
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : +1;
}
现在当我有这样的数组时:5a,10b,6c,HR9,44x
它将其分类为10b,44x,5a,6c,HR9
。
我想将其排序为5a,6c,10b,44x,HR9
如何实现这一目标?
编辑:我没有真正提到的一件事(我在代码中但在文本中没有这样做)是它是一个像这样的多维数组:
$array[0]["name"] = "5b";
$array[0]["..."] = "other values";
$array[1]["name"] = "10a";
$array[1]["..."] = "other values";
使用natsort和朋友我不能这样排序。
答案 0 :(得分:5)
我建议你只使用natsort()。它的行为与您尝试创建的行为相同。
要对多维数组进行排序,请参阅: http://www.php.net/manual/en/function.array-multisort.php#61976
function array_key_multi_sort($arr, $l , $f='strnatcasecmp')
{
usort($arr, create_function('$a, $b', "return $f(\$a['$l'], \$b['$l']);"));
return($arr);
}
答案 1 :(得分:1)
如果您想按自然顺序对字符进行排序(a
在H
之前),则可以使用natcasesort
。请考虑以下数组:
$array = array('5a', '10b', '6c', 'HR9', '44x', 'a9');
使用natsort
:
Array
(
[0] => 5a
[2] => 6c
[1] => 10b
[4] => 44x
[3] => HR9
[5] => a9
)
使用natcasesort
:
Array
(
[0] => 5a
[2] => 6c
[1] => 10b
[4] => 44x
[5] => a9
[3] => HR9
)
修改强>
您可以在输出中看到,即使在排序后索引也保持不变。因此,要对关联数组进行排序,您可以创建一维副本并使用其索引访问关联数组。在迭代排序的数组时,不要忘记使用foreach
而不是for
。
答案 2 :(得分:0)
对于除HR9
之外的数组中的每个项目,php中的natsort()函数都可以很好地处理排序。它忽略了非数字字符,并按数字字符排序,就好像它们是数字一样。
这是natsort()的文档。 http://us.php.net/natsort
$array = array(5a,10b,6c,HR9,44x);
natsort($array);
新订单现在应该是:
5a,6c,HR9,10b,44x
之后你可以使用你的排序功能,只有当其中一个字符串的第一个字符是非数字时才排序
关于你的多维数组:
$temp_array = array();
foreach($array as $key => $value):
$temp_array[$key] = $value['name'];
endforeach;
natsort($temp_array);
这将为您提供一个有序的关联数组,其中键是原始数组的元素编号,值是'name'
你可以