@Exair

Как решить правильно простенькую задачку по php?

Сразу скажу,что сравнительно недавно начал изучать php, и решаю задачи из сайта Вот
Условие задачи
Создайте строку из 6-ти случайных маленьких латинских букв так, чтобы буквы не повторялись. Нужно сделать так, чтобы в нашей строке могла быть любая латинская буква, а не ограниченный набор.

Мой план решения
1)Создать строку с 26 буквами латинского алфавита
2)Инициализировать пустую переменную
3)Из строки с буквами сделать массив через explode
4)В цикле for пройтись по этому массиву(нужно 6 итераций)
5)Вывести новую строку на экран

Решение
$str = "a,b,c,d,e,f,g,h,i,j,k,l,
        m,n,o,p,q,r,s,t,u,v,w,x,y,z";
$newStr = "";
$arr = explode(",", $str);

for($i = 0;$i < 6;$i++) {
    $rand = mt_rand(0, 25);
    $newStr .= $arr{$rand};
}
echo $newStr;

Проблема заключается в том, что спустя n-ое количество рандомных строк показываются строки с пробелом,хотя, как вы видите,его у меня в строке $str нет.
И еще вопрос, как решить эту задачу с использованием str_shuffle?
  • Вопрос задан
  • 1119 просмотров
Решения вопроса 1
HeadOnFire
@HeadOnFire
Laravel & WordPress Evangelist
// По вашему коду:
$source_string = 'abcdefghijklmnopqrstuvwxyz';
$string_randomized = str_shuffle($source_string); // Перетасовали буквы внутри строки
echo substr($string_randomized, 0, 6); // Вывели первые 6, без повторений и каждый раз после str_shuffle - уникально-рандомно (относительно, но задача именно этого и требует)

// По красоте:
$characters = 'abcdefghijklmnopqrstuvwxyz';
echo substr(str_shuffle($characters), 0, 6);

// Тестируем в psych:
>>> $characters = 'abcdefghijklmnopqrstuvwxyz';
=> "abcdefghijklmnopqrstuvwxyz"
>>> echo substr(str_shuffle($characters), 0, 6);
fzpvad
>>> echo substr(str_shuffle($characters), 0, 6);
bzeiyj
>>> echo substr(str_shuffle($characters), 0, 6);
pgkuaq
>>> echo substr(str_shuffle($characters), 0, 6);
otjszx
>>> echo substr(str_shuffle($characters), 0, 6);
zjwaox
>>> echo substr(str_shuffle($characters), 0, 6);
rxuhnv
>>> echo substr(str_shuffle($characters), 0, 6);
rihoec
>>> echo substr(str_shuffle($characters), 0, 6);
uwdfgn
>>>
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Zoominger
@Zoominger
Сись админ
Буквы будут рано или поздно повторяться, если отталкиваться от текущего решения, то я бы загонял шесть случайных чисел в отдельный массив и проверял бы новое рандомное на принадлежность одному из предыдущих.

А на кой чёрт вообще все эти движения с explode, если можно было просто создать строку со всеми буквами и обращаться к отдельным буквам просто по индексу?
Ответ написан
Stimulate
@Stimulate
могу
$letters = range('a', 'z');
shuffle($letters);
$newStr = "";
for($i = 0;$i < 6;$i++) {
    $newStr .= $letters[array_rand($letters)];
}
echo $newStr;


"чтобы буквы не повторялись." - этот пункт не выполнен
Ответ написан
@FanatPHP
Проблема заключается в том, что спустя n-ое количество рандомных строк показываются строки с пробелом

Это очень забавный вопрос :)
хотя, как вы видите,его у меня в строке $str нет.

Как мы видим, его у тебя там есть :)
Ответ написан
@Maksimoff
напишу свой вариант, ради спортивного интереса:
function randString($length = 6) {
	$out = "";
	$chars = range("a", "z");
	while (strlen($out) < $length) {
		$rand = rand(0, count($chars) - 1);
		$out .= $chars[$rand];
		unset($chars[$rand]);
	}
	return $out;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы