Всем привет! Возможно вопрос глупый, но все же... Сам вопрос: Как можно вызвать функцию n кол-во раз так, чтобы она выдавала разный результат на странице(например 5 разных результатов)? Сейчас если вызывать функцию например 5 раз то она отдаст одно и тоже 5 раз. Что делает функция: Просто генератор паролей из заранее заготовленных значений в массивах которые создаются согласно выбранным условиям. Для чего это делается: Учил регулярные выражения, только хотел перейти к написанию условий проверки и в голову ударило попробовать выводить несколько разных вариантов паролей. Что пытался сделать: Использовал цикл for, пытался записать их в разные переменные(выдает только один результат), гуглил и нашел только это на stackoverflow. Выводил через echo Код PHP PHP: error_reporting(0); //Получили данные из формы $lenght = $_POST['pasLenght']; $number = $_POST['number']; $charters = $_POST['charters']; // Условия для проверки введенных данных if (preg_match("/[0-9]/",$lenght) && strlen($lenght) > 0) { echo "введены цифры<br/>"; } elseif (preg_match("/[а-яА-ЯёЁa-zA-Z\-_]+/", $lenght) && strlen($lenght) > 0) { echo "не вводите буквы<br/>"; } elseif ( strlen($lenght) == 0) { echo "введите число<br/>"; } else { echo "введены недопустимые символы ". "\" <b>" . $lenght . "</b> \"" ."<br>"; } if ($number != "" ) { $number = true; echo "цифры выбраны" . "<br/>"; } else { echo "цифры не выбраны" . "<br/>"; } if ($charters != "") { $charters = true; echo "спецсимволы выбраны" . "<br/>"; } else { echo "спецсимволы не выбраны" . "<br/>"; } //Начинаем генерировать пароль по параметрам function generatePassword($lenght,$number,$characters) { //Массивы с данными $charactersArray = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','X','Y','Z',); $numberArray = array('1','2','3','4','5','6','7','8','9','0'); $specialCharactersArray = array('!','@','#','$','%','-','^','&','*','(',')','_','+','~','"','%','~',':',';','[',']','\\','/','{','}','|','<','>','?' ); $passwordArray = array(); //функция для случайного смешивания function passwordMixed($lenght,$passwordArray) { for ($i = 0; $i < $lenght; $i++) { $index = random_int(0, count($passwordArray) - 1); $mixedResult .= $passwordArray [$index]; } return $mixedResult; } //условия для паттернов, чтобы проверять в будущем if ($number == true && $characters == false) { $passwordArray = array_merge($charactersArray,$numberArray); $pattern = '/[a-zA-Z0-9]/'; } elseif ($number == false && $characters == true) { $passwordArray = array_merge($charactersArray,$specialCharactersArray); $pattern = '/[a-zA-Z\!\@\#\$\%\-\^&\*\(\)\,\_\+\~\"\%\:\;\[\]\\/\{\}\|\<\>\?]/'; } elseif ($number == true && $characters == true) { $passwordArray = array_merge($charactersArray,$numberArray,$specialCharactersArray); $pattern = '/[a-zA-Z0-9\!\@\#\$\%\-\^&\*\(\)\,\_\+\~\"\%\:\;\[\]\\/\{\}\|\<\>\?]/'; } else { $passwordArray = array_merge($charactersArray); $pattern = '/[a-zA-Z]/'; } $password = passwordMixed($lenght,$passwordArray ); //Проверка на наличие нужных символов /* * не менее 2 вариантов символов * нет одинаковых видов символов подряд * нет одинаковых символов */ if (mb_strlen($password) > 0) { echo mb_strlen($password, 'UTF-8') . "<br>"; } return $password; } echo generatePassword($lenght,$number,$charters);[/code] [B]Код формы[/B] [code]<form action="" method="post"> <div class="form-group"> <label for="lenght">Какой длины сделать пароль?</label> <input class="form-control-range" type="range" name="pasLenght" id="pasLenght" value="12" min="6" max="12" oninput="pasLenghtOutput.value = pasLenght.value"> <div>Длина пароля будет: <output name="pasLenghtOutput" id="pasLenghtOutput">12</output> символов</div> </div> <div class="form-group form-check"> <input id="number" type="checkbox" class="form-check-input" name="number"> <label class="form-check-label" for="number">Использовать цифры?</label> </div> <div class="form-group form-check"> <input id="symbol" type="checkbox" class="form-check-input" name="charters"> <label class="form-check-label" for="symbol">Использовать спецсимволы?</label> </div> <input class="btn btn-primary" type="submit" value="сгенерировать"> </form> Примечание: Еще не сделал проверку результата функции, планировалось что passwordMixed() будет повторяться пока не совпадет с условиями проверки и только после этого generatePassword() вернет результат. Если знаете что поменять,укажите на ошибки или подскажите что лучше почитать/посмотреть буду благодарен.
Ну инициализируй перед генерацией через random, функцией mt_rand() это элементарно и во всех учебниках и доках по языку... А вообще всё слишком замудрено... Всё проще можно
Где использовать? При выводе? Как именно использовать? Данные принимаются из формы и на основе условий происходит генерация с помощью random_int() Тут суть написания всего кода чтобы в процессе научиться работать с регулярными выражениями, а именно сравнить и проверить, научиться писать паттерны. Просто возник вопрос почему если написать например Код (Text): function el() { echo random_int(1,100) . '<br>'; } for ($i = 0; $i < 5; $i++) { el(); } То все замечательно и получаем 5 разных значений, но если проворачивать это со скриптом в вопросе то выходит одно и тоже значение.
Одно и тоже ? Впервую очередь возьми тестовый php файл и запусти у себя на локале, проверь что выдает без пустословия.
Что именно замудрено? Проверка входящих данных? Смешивание массивов? Если посмотрите внимательно то в условиях написана проверка введенных символов для range, т.к там возможно изменение под текстовое поле, это была первая практика по работе с регулярными выражениями. Отдельно написал для чего все это делается --- Добавлено --- --- Добавлено --- Меняет одну цифру которая задавалась через $i, вы видимо не поняли вопрос
@spamolov, всё замечательно отрабатывает в песочнице. PS: без некоторых изменений, конечно, не обошлось. Спойлер Вынесено объявление функции из тела функции, чтобы не падало с Fatal error. Инициализирована переменная $mixedResult.
Спасибо! Для тех кто читает в будущем это правильный ответ на вопрос, ответы от остальных можно не смотреть. Вынес функцию passwordMixed() из функции generatePassword() все заработало. Единственное непонятно зачем переменная $mixedResult если и без нее все работает?
Раз уж используется конкатенация этой переменной с её предыдущим значением, логично, чтобы это значение всё-таки было. Зачем на кузнец Warning: Undefined variable?