Tengo cadenas de nombres de usuario en array. Quiero generar una cadena única de nombre de usuario que no salga en la matriz (probablemente con algunos números después del nombre de usuario)
¿Cómo logro esto?
He resumido el código:
function generate_unique_username(){ $firstname = "james";//data coming from user $lastname = "oduro";//data coming from user $new_username = $firstname.$lastname; $usersnames = array("james39","oduro32","kwame93","elvisasante","frimpong32","edward32","jamesoduro"); //Loop through ARRAY usernames and check elements against VAR $new_username if (in_array($new_username, $usersnames)) { //generate new username which is not inside array //the new generated string should also be check against array to ensure is doens not exit. }else{ return $new_username; } }
Gracias.
Generar un nombre de usuario a partir de la matriz almacenada no es una buena práctica, le sugiero que use la base de datos.
Si está utilizando la base de datos en lugar de la matriz, puede utilizar el mejor método para generar el nombre de usuario único de la siguiente manera:
function generate_unique_username(){ $firstname = "james";//data coming from user $lastname = "oduro";//data coming from user $new_username = $firstname.$lastname; /* Note: writing here pseudo sql code, replace with the actual php mysql query syntax */ $query = "SELECT COUNT(id) as user_count FROM user WHERE username like '%".$new_username."%'"; $result = mysql_query($query); $count = $result['user_count']; if(!empty($count)) { $new_username = $new_username . $count; } return $new_username; }
Creo que en este caso, primero debe intentar asignar nombres de usuario más geniales a los usuarios y luego, cuando eso falle, busque un sufijo numérico. Este es un enfoque que puedo usar. Es posible que deba cambiar el código a su llamada mysqli más preferida y segura, como usar la declaración preparada PDO o MySQLI.
//function that will be used to figure out if the user name is available or not function isAvailable($userName){ global $mysqli; $result = $mysqli->query("SELECT id FROM users WHERE user_name='$userName'") or die($mysqli->error()); // We know username exists if the rows returned are more than 0 if ( $result->num_rows > 0 ) { //echo 'User with this username already exists!'; return false; }else{ return true; } } function generate_unique_username($firstname, $lastname, $id){ $userNamesList = array(); $firstChar = str_split($firstname, 1)[0]; $firstTwoChar = str_split($firstname, 2)[0]; /** * an array of numbers that may be used as suffix for the user names index 0 would be the year * and index 1, 2 and 3 would be month, day and hour respectively. */ $numSufix = explode('-', date('Ymd-H')); // create an array of nice possible user names from the first name and last name array_push($userNamesList, $firstname, //james $lastname, // oduro $firstname.$lastname, //jamesoduro $firstname.'.'.$lastname, //james.oduro $firstname.'-'.$lastname, //james-oduro $firstChar.$lastname, //joduro $firstTwoChar.$lastname, //jaoduro, $firstname.$numSufix[0], //james2019 $firstname.$numSufix[1], //james12 ie the month of reg $firstname.$numSufix[2], //james28 ie the day of reg $firstname.$numSufix[3] //james13 ie the hour of day of reg ); $isAvailable = false; //initialize available with false $index = 0; $maxIndex = count($userNamesList) - 1; // loop through all the userNameList and find the one that is available do { $availableUserName = $userNamesList[$index]; $isAvailable = isAvailable($availableUserName); $limit = $index >= $maxIndex; $index += 1; if($limit){ break; } } while (!$isAvailable ); // if all of them is not available concatenate the first name with the user unique id from the database // Since no two rows can have the same id. this will sure give a unique username if(!$isAvailable){ return $firstname.$userId; } return $availableUserName; } //Get the unique user id from your database, for now let's go with 30 $userId = 30; echo generate_unique_username('john', 'oduro', $userId);
Además, sería bueno proporcionar una función alternativa en la que el usuario pueda cambiar su nombre de usuario a cualquier otro valor único, en caso de que no le guste el valor generado automáticamente.