Упростить код [PHP]
Я новичок в мире программирования. Мне нужна более основополагающая логика в решении задач. Задача: сгенерировать стих. Есть 5 массивов из их нужно создать один общий, и уже из него выбирать элементы циклом.
Massive:
$word1 = array('Чудесных', 'Суровых', 'Занятных', 'Внезапных');
$word2 = array('слов', 'зим', 'глаз', 'дней', 'лет', 'мир', 'взор');
$word3 = array('прикосновений', 'поползновений', 'судьбы явлений', 'сухие листья', 'морщины смерти', 'долины края', 'замены нету', 'сухая юность', 'навек исчезнув');
$word4 = array('обретаю', 'понимаю', 'начертаю', 'закрываю', 'оставляю', 'вынимаю', 'умираю', 'замерзаю', 'выделяю' );
$word5 = array('очертания', 'безысходность', 'начертанья', 'смысл жизни', 'вирус смерти', 'радость мира');
Добавление массивов в один общий.
$allArray = array($word1, $word2, $word3, $word4, $word5);
Сам цикл.
for ($i = 0; $i <= 1; $i++) {
$random = array_rand($allArray[0]);
$random1 = array_rand($allArray[1]);
$random2 = array_rand($allArray[2]);
$random3 = array_rand($allArray[3]);
$random4 = array_rand($allArray[4]);
echo $allArray[0][$random] . " " . $allArray[1][$random1] . " " . $allArray[2][$random2] . "<br>";
}
echo "Я " . $allArray[3][$random3] . " " . $allArray[3][$random4];
В данном решении я определяю генератор случайного числа у массива. Затем я беру по отдельности элементы массива и вместо индекса добавляю получившиеся случайное число.
Данное решение работает, но очень много кода.
По итогу должна получится такая структура
слово1 слово2 слово3
слово1 слово2 слово3
Я слово4 слово5
Как правильно упростить это решение, хотелось бы узнать в развернутом ответе. Спасибо.
Ответы (2 шт):
$rw1=count($word1);
$rw2=count($word2);
$rw3=count($word3);
$rw4=count($word4);
$rw5=count($word5);
//без цикла
$set1=rand(0, $rw1-1);
$set2=rand(0, $rw2-1);
$set3=rand(0, $rw3-1);
$set4=rand(0, $rw4-1);
$set5=rand(0, $rw5-1);
$text=$word1[$set1].' ,'.$word2[$set2].' ,'.$word3[$set3].' ,'.$word4[$set4].' ,'.$word5[$set5];
print_r($text);
//С циклом, мсеньше кода.
for ($i=1; $i <=5 ; $i++) {
${'rw' . $i}=count(${'word' . $i});
${'set' . $i}=rand(0, ${'rw' . $i}-1);
$summ[]= ${'word' . $i}[${'set' . $i}];
}
echo "<br>";
$comma_separated = implode(" ", $summ);
print_r($comma_separated);
echo "<br>";
сведя все в один массив вы только усложнили код, внеся в него индексы.
заведите функцию с 5 параметрами по числу массивов.
function write($w1, $w2, $w3, $w4, $w5){
}
определите функцию, которая будет возвращать случайный элемент. Если нужно чтобы элементы не повторялись, то соответственно надо их удалять. В таком случае проще всего воспользоваться shuffle + array_shift:
$rand = function(&$arr){
shuffle($arr); return array_shift($arr);
};
а если с повторами то просто return $arr[array_rand($arr)];
Далее просто составьте строки своего стиха:
$line1 = implode(' ', [$rand($w1), $rand($w2), $rand($w3)]);
В общем виде все будет выглядеть так.
function write($w1, $w2, $w3, $w4, $w5){
$rand = function(&$arr){
shuffle($arr); return array_shift($arr);
};
$line1 = implode(' ', [$rand($w1), $rand($w2), $rand($w3)]);
$line2 = implode(' ', [$rand($w1), $rand($w2), $rand($w3)]);
$line3 = implode(' ', ["Я", $rand($w4), $rand($w5)]);
return "$line1\n$line2\n$line3";
}
чем проще и читабельней код тем лучше. в нем сложнее допустить ошибку и легче понять. Индексы и циклы в вашем решении делают его запутанным.