Получение кратчайшего уникального имени из полей Имя и Фамилия - PullRequest
2 голосов
/ 09 мая 2011

У меня есть многомерный массив, называемый пользователями, который отформатирован следующим образом, и я пытаюсь создать сценарий, который будет создавать «имя пользователя» на основе этой информации:

$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')
  • Если есть нет повторяющихся имен, которые он использует только первое имя в качестве имени пользователя ( " Эрик ").

  • Если есть два имени с одинаковыми первые, но разные начальные буквы в фамилии он будет использовать имя как фамилия (" Стив Л."и" Стив Р.").

  • Если у нескольких людей последний имя и фамилия, потом вернуть полное имя (" Боб Смит " и " Боб Сандерс ").

  • Наконец, если ЖЕ точное имя найденный тогда он добавит число к каждый из них так: «Боб Сандерс (1) » и " Боб Сандерс (2) "

Я надеюсь, что это может быть сделано эффективно и не с большим количеством петель, но я не могу понять это для моей жизни.

Заранее благодарю за любую помощь, которую вы можете предложить!

1 Ответ

1 голос
/ 09 мая 2011

Этот скрипт не такой изящный, но в значительной степени делает то, что вы хотите. Обратите внимание, что он использует только два цикла, но нуждается в дополнительной памяти для хранения метаданных о пользователях:

<code>    <?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('
'); ?>
...