2

我有一个与 usort 一起使用的自定义排序功能:

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

4

3 回答 3

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);
}
于 2012-09-09T17:38:11.273 回答
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

于 2012-09-09T18:00:12.340 回答
0

好吧,对于数组中的每个项目,HR9php 中的 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);

这将为您提供一个有序的关联数组,其中键是原始数组的元素编号,值是“名称”

你可以

于 2012-09-09T17:52:29.207 回答