这个脚本不是那么漂亮,但几乎没有你想要的。请注意,它仅使用两个循环,但需要一些额外的内存来存储有关用户的元数据:
<?php
$users = array(
array("first_name"=>"Bob", "last_name"=>"Smith"),
array("first_name"=>"Steve", "last_name"=>"Little"),
array("first_name"=>"Eric", "last_name"=>"Fielder"),
array("first_name"=>"Steve", "last_name"=>"Richardson"),
array("first_name"=>"Bob", "last_name"=>"Sanders"),
array("first_name"=>"Bob", "last_name"=>"Sanders")
);
$_users_info = array("first_name_count"=>array(),"last_name_count"=>array(),"first_name_last_initial_count"=>array());
foreach($users as $user){
$_users_info["first_name_count"][$user["first_name"]] = isset($_users_info["first_name_count"][$user["first_name"]]) ? ++$_users_info["first_name_count"][$user["first_name"]] : 1;
$_users_info["last_name_count"][$user["last_name"]] = isset($_users_info["last_name_count"][$user["last_name"]]) ? ++$_users_info["last_name_count"][$user["last_name"]] : 1;
$_users_info["first_name_last_initial_count"][$user["first_name"]."#".substr($user["last_name"],0,1)] = isset($_users_info["first_name_last_initial_count"][$user["first_name"]."#".substr($user["last_name"],0,1)]) ? ++$_users_info["first_name_last_initial_count"][$user["first_name"]."#".substr($user["last_name"],0,1)] : 1;
$_users_info["complete_name_count"][$user["first_name"]."#".$user["last_name"]] = isset($_users_info["complete_name_count"][$user["first_name"]."#".$user["last_name"]]) ? ++$_users_info["complete_name_count"][$user["first_name"]."#".$user["last_name"]] : 1;
$_users_info["complete_name_allocated"][$user["first_name"]."#".$user["last_name"]] = 0;
}
print('<pre>');
foreach($users as $user) {
$username = null;
if($_users_info["first_name_count"][$user["first_name"]]==1) $username = $user["first_name"];
else if($_users_info["first_name_last_initial_count"][$user["first_name"]."#".substr($user["last_name"],0,1)]==1) $username = $user["first_name"]." ".substr($user["last_name"],0,1).".";
else if($_users_info["last_name_count"][$user["last_name"]]==1) $username = $user["first_name"]." ".$user["last_name"];
else $username = $user["first_name"]." ".$user["last_name"].sprintf(" (%d)",++$_users_info["complete_name_allocated"][$user["first_name"]."#".$user["last_name"]]);
printf("%s %s => %s\n",$user["first_name"],$user["last_name"],$username);
}
print('</pre>');
?>
只是要确保名称已被事先清理:规范外壳和删除多余的空格/字符。 – Schwartzie 2011-05-09 15:44:55
完美...元数据是一个很好的解决方案。谢谢! – RANGER 2011-05-09 17:48:22