Как найти доступное место в массиве с нумерованными значениями?

Допустим, у меня есть массив имен пользователей как таковой:

[
'john.doe',
'john.doe1',
'john.doe2',
'john.doe4',
'john.doe5'
]

Теперь новый пользователь регистрируется как john.doe. Я получил уже существующие john.doe из БД с помощью запроса LIKE и сохранил их в массиве выше. Затем я хочу перебрать этот массив, чтобы увидеть, какое место доступно для недавно зарегистрированного john.doe.

В этом случае доступное место будет john.doe3.

Я знаю, как это сделать, используя цикл while и просто добавляя приращение, пока нет совпадений.

В основном у меня есть два вопроса:

  • Правильный ли это подход к решению этой проблемы с повторяющимся именем пользователя?

  • Мне было интересно, может быть, есть ли лучший способ вместо использования цикла while?

1

Решение

  1. Нет — лучше использовать идентификационный токен, рассмотрите возможность добавления третьего значения, такого как: md5('username'.'date') или же md5('username'.'fullname') и затем вы можете использовать этот идентификатор для конкретного пользователя.

    Лучшей практикой будет использование только идентификатора строки пользователя для отношений и для любого запроса, и единственный шаг, который вы используете для имени пользователя (+ пароль), — это вход в систему.

  2. Ну вот:

    //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);
    }
    
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]