2011-05-09 134 views
2

我有一个称为用户的多维数组,格式如下,我试图创建一个脚本,它将根据此信息创建一个“用户名”:从姓氏和姓氏字段中获取最短的唯一名称

$users(first_name => 'Bob', last_name => 'Smith') 
$users(first_name => 'Steve', last_name => 'Little') 
$users(first_name => 'Eric', last_name => 'Fielder') 
$users(first_name => 'Steve', last_name => 'Richardson') 
$users(first_name => 'Bob', last_name => 'Sanders') 
$users(first_name => 'Bob', last_name => 'Sanders') 
  • 如果有 没有重复的名字只使用 第一名称作为用户名 (“埃里克”)。

  • 如果有两个名字与姓氏相同 第一,但不同的首字母 将使用 名字作为姓氏首字母(” 史蒂夫 L.‘和’史蒂夫R. “)。

  • 如果多人有最后 姓氏和初始然后 返回全名(“鲍勃·史密斯‘和 ’鲍勃·桑德斯”)。

  • 最后,如果相同的确切名称是 发现那么它将一个号码追加到 每个这样的:“鲍勃桑德斯(1)”和 “鲍勃桑德斯(2)

我希望这可以有效地完成,而不是有很多循环,但我无法弄清楚我的生活。

非常感谢您提供任何帮助!

回答

1

这个脚本不是那么漂亮,但几乎没有你想要的。请注意,它仅使用两个循环,但需要一些额外的内存来存储有关用户的元数据:

<?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>'); 
    ?> 
+0

只是要确保名称已被事先清理:规范外壳和删除多余的空格/字符。 – Schwartzie 2011-05-09 15:44:55

+0

完美...元数据是一个很好的解决方案。谢谢! – RANGER 2011-05-09 17:48:22