создать случайный массив без дублирующих элементов вместе - PullRequest
1 голос
/ 23 апреля 2020

У меня есть массив, аналогичный следующему:

$myArray = ['a', 'b', 'c', 'd', 'e', 'f'];

Мне нужно связать этот элемент со строкой в ​​al oop, и я пытаюсь сделать то же самое, как показано ниже:

foreach($products as $product) {
    echo $myArray[array_rand($myArray)] . '-' . $product['name']   
}

И это может быть вывод этой

c - красная книга
c - черный телефон
a - зеленая книга
e - розовый ноутбук
a - голубая рубашка

Как видите, два первых ряда имеют префикс одинаковый, что здесь недопустимо. Повторения хороши (один и тот же префикс может встречаться несколько раз), но не в двух строках рядом друг с другом.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Вам нужно сохранить предыдущее значение в переменной, а затем сгенерировать новое случайное значение, пока оно не будет отличаться от предыдущего - поэтому небольшая рекурсивная проверка. Мы также добавляем проверку для count($myArray) > 1, если в массиве есть только 1 значение (которое может привести к бесконечному l oop).

Мы используем while l oop, потому что есть вероятность, хотя и очень малая, что если значение равно предыдущему, то и следующее значение равно предыдущему. В действительности, в то время как l oop обычно никогда не повторяется более одного раза для большинства элементов (как я оправдываю использование al oop в al oop).

$previous = null;
foreach($products as $product) {
    do {
        $prefix = $myArray[array_rand($myArray)];
    } while ($prefix === $previous && count($myArray) > 1);
    $previous = $prefix;
    echo $prefix . '-' . $product['name'];
}
1 голос
/ 23 апреля 2020

Вы можете сохранить ранее использованный ключ и перебирать свой ранд, пока не получите новый ключ:

$previous_key = '';
foreach ($products as $product) {

    do {
        $key = array_rand($myArray);
    } while ($previous_key === $key);

    echo $myArray[$key] . '-' . $product['name'];

    $previous_key = $key;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...