我有一个数组,我希望回显按字母顺序排列,同时忽略启动每个字符串的数字,如下:
0 Apple
1 Apple
3 Apple
0 Banana
1 Banana
0 Carrot
//...
排序时,数字先排序。所以,我尝试了asort,sort_string没有成功。
$file = file("grades.txt");
asort($file, SORT_STRING);
我可以只查看字母字符并忽略数字吗?或者我可以忽略第一个字符并从第二个字符开始排序吗?我该怎么做才能得到上述结果?
如果在按字母顺序回显数组之后数字可以按顺序排列会很棒,但是如果太难做就不需要它。
答案 0 :(得分:1)
也许尝试php的uasort功能。 http://php.net/manual/en/function.uasort.php
function cmp($a, $b) {
if ($a[2] == $b[2]) {
return 0;
}
return ($a[2] < $b[2]) ? -1 : 1;
}
uasort($array, 'cmp');
答案 1 :(得分:1)
您可以交换字母部分和数字部分的位置,并使用strcmp()
比较usort()
中的字符串。
http://php.net/manual/en/function.usort.php
usort($arr, function($a, $b) {
$a = $a[2].' '.$a[0];
$b = $b[2].' '.$b[0];
return strcmp($a, $b);
});
答案 2 :(得分:0)
为此,您需要一个自定义订单功能,您可以使用uasort()
,例如
简单explode()
你的字符串用空格,并将数字和字符串保存在变量中。然后,如果字符串是相同的顺序,则按数字排序。否则按字符串排序。
uasort($arr, function($a, $b){
list($numberA, $stringA) = explode(" ", $a);
list($numberB, $stringB) = explode(" ", $b);
if(strnatcmp($stringA, $stringB) == 0)
return $numberA < $numberB ? -1 : 1;
return strnatcmp($stringA, $stringB);
});
答案 3 :(得分:0)
您可以使用preg_replace()
从字符串开头删除数字,preg_replace()
接受第三个参数(subject
)作为数组(对每个项目执行搜索和替换)。< / p>
$file = preg_replace( '/^[\d\s]+/', '', file("grades.txt") );
arsort( $file );
编辑:
使用preg_replace( '/^([\d\s]+)(.+)/', '$2 $1', file("grades.txt") )
将数字移到字符串的末尾。