php自定义排序函数数字

时间:2012-09-09 17:29:27

标签: php function sorting

我正在使用自定义排序功能,我使用的是:

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和朋友我不能这样排序。

3 个答案:

答案 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)

如果您想按自然顺序对字符进行排序(aH之前),则可以使用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'

你可以