Как создать случайную строку с помощью PHP?

Это условие всегда верно:

if ($user_security == 0 OR 1)

Потому что 1 всегда является «истинным» значением. Не думайте о булевых выражениях с точки зрения того, как вы можете произносить их вслух, всегда думайте о них с точки зрения отдельных выражений. В этом случае у вас есть два выражения: $user_security == 0, которое условно истинно или ложно в зависимости от переменной; и 1, что всегда верно.

Вы, вероятно, хотите это вместо:

if ($user_security == 0 OR $user_security == 1)
57
задан meagar 27 October 2011 в 03:39
поделиться

7 ответов

Что ж, вы не прояснили все вопросы, которые я задал в моем комментарии, но я предполагаю, что вам нужна функция, которая может принимать строку из «возможных» символов и длину строка для возврата. Тщательно прокомментировано, как и требовалось, с использованием большего количества переменных, чем я обычно, для ясности:

function get_random_string($valid_chars, $length)
{
    // start with an empty random string
    $random_string = "";

    // count the number of chars in the valid chars string so we know how many choices we have
    $num_valid_chars = strlen($valid_chars);

    // repeat the steps until we've created a string of the right length
    for ($i = 0; $i < $length; $i++)
    {
        // pick a random number from 1 up to the number of valid chars
        $random_pick = mt_rand(1, $num_valid_chars);

        // take the random character out of the string of valid chars
        // subtract 1 from $random_pick because strings are indexed starting at 0, and we started picking at 1
        $random_char = $valid_chars[$random_pick-1];

        // add the randomly-chosen char onto the end of our string so far
        $random_string .= $random_char;
    }

    // return our finished random string
    return $random_string;
}

Чтобы вызвать эту функцию с данными вашего примера, вы должны назвать ее примерно так:

$original_string = 'abcdefghi';
$random_string = get_random_string($original_string, 6);

Обратите внимание, что эта функция не проверяет уникальность в ему переданы действительные символы. Например, если вы вызвали его с допустимой строкой символов 'AAAB' , было бы в три раза больше шансов выбрать A для каждой буквы в качестве B. Это можно было бы считать ошибкой или функцией. , в зависимости от ваших потребностей.

92
ответ дан 7 November 2019 в 05:41
поделиться

Попробуйте это

Достаточно простой!

function RandomFromCharset($charset,$length) 
{

$characters = $charset; // your existing charset / defined string
    $charactersLength = strlen($characters);
    $random_from_charset = '';
    for ($i = 0; $i < $length; $i++) 
    {
        $random_from_charset.= $characters[rand(0, $charactersLength - 1)];
    }

return random_from_charset;
}

Вызывают функцию следующим образом

RandomFromCharset($charset,$length);

, где $length будет длиной случайной строки, Вы хотите (это может быть предопределено также в функции как RandomFromCharset(charset,$length=10)) генерировать и , $charset будет Вашей существующей строкой, которой Вы хотите ограничить символы.

0
ответ дан 7 November 2019 в 05:41
поделиться

вы можете создать массив символов, а затем использовать rand (), чтобы выбрать букву из массива и добавить ее в строку.

$letters = array( [0] => 'a' [1] => 'b' [2] => 'c' [3] => 'd' ... [25] = 'z');

$lengthOfString = 10;
$str = '';

while( $lengthOfString-- )
{
   $str .= $letters[rand(0,25)];
}
echo $str;

* обратите внимание, что это позволяет повторять символы

-1
ответ дан 7 November 2019 в 05:41
поделиться

Хотите создать пароль путем случайной перестановки исходных букв? Должен ли он содержать только уникальные символы?

Используйте rand для выбора случайных букв по индексу.

0
ответ дан 7 November 2019 в 05:41
поделиться
function generate_random_string($name_length = 8) {
    $alpha_numeric = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    return substr(str_shuffle(str_repeat($alpha_numeric, $name_length)), 0, $name_length);
}

Обновлен код в соответствии с замечательным предложением mzhang в комментариях ниже.

17
ответ дан 7 November 2019 в 05:41
поделиться

Объединение символов в конце должно быть более эффективным, чем повторное объединение строк.

Правка №1: Добавлено возможность избежать повторения символов.

Правка №2: Выдает исключение, чтобы избежать бесконечного цикла, если выбрано $ norepeat и $ len больше, чем кодировка для выбора.

Редактировать №3: Использует ключи массива для хранения выбранных случайных символов, когда $ norepeat выбран, так как поиск ключа ассоциативного массива выполняется быстрее, чем линейный поиск в массиве.

function rand_str($len, $norepeat = true)
{
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $max = strlen($chars) - 1;

    if ($norepeat && len > $max + 1) {
        throw new Exception("Non repetitive random string can't be longer than charset");
    }

    $rand_chars = array();

    while ($len) {
        $picked = $chars[mt_rand(0, $max)];

        if ($norepeat) {
            if (!array_key_exists($picked, $rand_chars)) {
                $rand_chars[$picked] = true;
                $len--;
            }
        }
        else {
            $rand_chars[] = $picked;
            $len--;
        }
    }

    return implode('', $norepeat ? array_keys($rand_chars) : $rand_chars);   
}
6
ответ дан 7 November 2019 в 05:41
поделиться

Если вы хотите разрешить повторение символов, вы можете использовать эту функцию:

function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
{
    $str = '';
    $count = strlen($charset);
    while ($length--) {
        $str .= $charset[mt_rand(0, $count-1)];
    }
    return $str;
}

Базовый алгоритм состоит в генерации < length > раз случайного числа от 0 и < количество символов > - 1 мы используем в качестве индекса для выбора символа из нашего набора и объединения этих символов. Границы 0 и < количество символов > - 1 представляют границы строки $ charset , поскольку первый символ адресуется с помощью $ charset [0] и последний с $ charset [count ($ charset) - 1] .

98
ответ дан 7 November 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: