Допустим, у меня есть массив имен пользователей как таковой:
[
'john.doe',
'john.doe1',
'john.doe2',
'john.doe4',
'john.doe5'
]
Теперь новый пользователь регистрируется как john.doe. Я получил уже существующие john.doe из БД с помощью запроса LIKE и сохранил их в массиве выше. Затем я хочу перебрать этот массив, чтобы увидеть, какое место доступно для недавно зарегистрированного john.doe.
В этом случае доступное место будет john.doe3.
Я знаю, как это сделать, используя цикл while и просто добавляя приращение, пока нет совпадений.
В основном у меня есть два вопроса:
Правильный ли это подход к решению этой проблемы с повторяющимся именем пользователя?
Мне было интересно, может быть, есть ли лучший способ вместо использования цикла while?
Нет — лучше использовать идентификационный токен, рассмотрите возможность добавления третьего значения, такого как: md5('username'.'date')
или же md5('username'.'fullname')
и затем вы можете использовать этот идентификатор для конкретного пользователя.
Лучшей практикой будет использование только идентификатора строки пользователя для отношений и для любого запроса, и единственный шаг, который вы используете для имени пользователя (+ пароль), — это вход в систему.
Ну вот:
//without while:
/* NOT TESTED */
/* $uname -> is the username requested without the duplicate number */
function find_aspot($arr, $uname) {
natsort($arr);
if (empty($arr) || $arr[0] !== $uname) return $uname;
foreach($arr as $key => $data) {
$cur = str_replace($uname,'',$data);
$cur = ($cur === '')?0:intval($cur);
if (!isset($arr[$key+1])) break;
$next = intval(str_replace($uname,'',$arr[$key+1]))
if ($cur+1 !== $next) break;
}
return $uname.($cur+1);
}
Других решений пока нет …