我想为那些选择了已经使用的用户名的用户建议用户名。
我如何建议他们的名字与各种下划线组合的所有可能的组合?
function username_options($name) {
$spacers = array('_','');
$username_options_array = array();
// how can I iterate through all combinations no matter how many
// words are included in the name?
// ex. joesmith, _joesmith, _joe_smith, _joe_smith_
// joe_smith, joe_smith_,
// joesmith_
}
$names = array('joe smith','alan beta gamma','albert beta gamma delta');
foreach ($names as $name) {
$username_options_array = username_options($name);
print_r($username_options_array);
}
合并像joe smith
这样的两个字符串很容易:
$a . $b
$a . '_' . $b
$a . $b . '_'
'_' . $a . $b
'_' . $a . $b . '_'
'_' . $a . '_' . $b . '_'
但是我如何更优雅地使用n
名称中的字符串数?所以alan beta gamma delta
和joe smith
一样容易填充?
您需要定义一个函数,该函数根据要放置空格的位置返回所有间隔符的组合。
function everyCombination($count,$len)
{
$elems = pow($count,$len);
$result = [];
for($i=0;$i<$elems;$i++)
$result[] = str_pad(base_convert($i,10,$count),$len,0,STR_PAD_LEFT);
return $result;
}
现在这个函数返回你的分隔符数组的所有索引组合,你所需要做的就是将你的字符串($name
)用空格展开,将分隔符和索引与数组的名称展开后结合起来。
function username_options($name)
{
$spacers = array('_','');
$result = [];
$words = explode(' ', $name);
$combinations = everyCombination(count($spacers),count($words)+1);
foreach ($combinations as $combin)
{
$str = $words[] = "";
for($i=0;$i<strlen($combin);$i++)
$str .= $spacers[$combin[$i]] . $words[$i];
$result[] = $str;
}
return $result;
}
现在测试完这个
$names = array('joe smith','alan beta gamma');
foreach ($names as $name) {
$username_options_array = username_options($name);
var_dump($username_options_array);
}
我得到的结果是:
array (size=8)
0 => string '_joe_smith_' (length=11)
1 => string '_joe_smith' (length=10)
2 => string '_joesmith_' (length=10)
3 => string '_joesmith' (length=9)
4 => string 'joe_smith_' (length=10)
5 => string 'joe_smith' (length=9)
6 => string 'joesmith_' (length=9)
7 => string 'joesmith' (length=8)
array (size=16)
0 => string '_alan_beta_gamma_' (length=17)
1 => string '_alan_beta_gamma' (length=16)
2 => string '_alan_betagamma_' (length=16)
3 => string '_alan_betagamma' (length=15)
4 => string '_alanbeta_gamma_' (length=16)
5 => string '_alanbeta_gamma' (length=15)
6 => string '_alanbetagamma_' (length=15)
7 => string '_alanbetagamma' (length=14)
8 => string 'alan_beta_gamma_' (length=16)
9 => string 'alan_beta_gamma' (length=15)
10 => string 'alan_betagamma_' (length=15)
11 => string 'alan_betagamma' (length=14)
12 => string 'alanbeta_gamma_' (length=15)
13 => string 'alanbeta_gamma' (length=14)
14 => string 'alanbetagamma_' (length=14)
15 => string 'alanbetagamma' (length=13)