使用名称对数组进行排序 我有一个阵列。
array(0 => Mr. Bala ,1 => Mr. Santhosh, 2 => Mrs. Camel,3 => Mrs. Vinoth);
仅根据名称
按升序对其进行排序我的预期输出是
array(
0 => Mr. Bala,
1 => Mrs. Camel,
2 => Mr. Santhosh,
3 => Mr. Vinoth,
);
答案 0 :(得分:6)
使用usort,取第二部分字符串,在
后用空格分割newFileSystem
由于Bart Friederichs发表评论,UPD
usort($a, function($i1, $i2) {
return strcmp(explode('. ',$i1)[1], explode('. ',$i2)[1]);
});
UPD2 使其不区分大小写
usort($a, function($i1, $i2) {
$t = explode('. ',$i1);
$i1 = (! isset($t[1]) ? $i1 : $t[1]);
$t = explode('. ',$i2);
$i2 = (! isset($t[1]) ? $i2 : $t[1]);
return strcmp($i1, $i2);
});
答案 1 :(得分:1)
只是我自己的旋转,应该更灵活一点。 Working Demo
usort($data, 'sortByName');
function sortByName($a, $b) {
$remove = [' ', '.', 'Mrs', 'Miss', 'Ms', 'Master', 'Dr', 'Mr'];
$a = str_replace($remove, '', $a);
$b = str_replace($remove, '', $b);
return strcasecmp($a, $b);
}
唯一需要注意的是$titles
需要按特定顺序排列,因为Mrs
必须始终在Mr
之前,因为Mr
在Mrs
之内1}}所以,如果您切换订单,那么Mr
可能会被带走,留下流氓S
相信应该为你想要的东西工作,任何问题都让我知道。
修改已更新。
答案 2 :(得分:0)
这是另一种方法,但这次使用正则表达式。 如果没有“。”也可以工作。先生或夫人之后
$arrToSort = ["Mr. Bala","Mr. Santhosh","Camel","Mrs. Vinoth","Mr Roger","Mr. Calmator","Janette","Mrs Anne Couture"];
usort($arrToSort, 'ignore_Title');
function ignore_Title($a, $b){
preg_match("/^Mrs{0,1}\.{0,1} (.*)$|/s",$a,$tmp);
preg_match("/^Mrs{0,1}\.{0,1} (.*)$|/s",$b,$tmp2);
return strcasecmp($tmp[1],($tmp2[1] == "" ? $b : $tmp2[1]));
}
print_r($arrToSort);
输出:
[0] => Mr. Bala
[1] => Camel
[2] => Mr. Calmator
[3] => Janette
[4] => Mrs Lark Obm
[5] => Mr Roger
[6] => Mr. Santhosh
[7] => Mrs. Vinoth