WQP 360 Posted June 20, 2014 Report Share Posted June 20, 2014 Здравствуйте, необходимо вывести два неповторяющихся числа. Я это делаю функцией function getFourRandomNumber ($maxCount){ $numbers = range(0, $maxCount); shuffle($numbers); return array($numbers[0], $numbers[1]); } но из range(0, $maxCount); мне нужно исключить одно число перед отбором, как это правильно реализовать? Quote Link to post Share on other sites
mittus 21 Posted June 20, 2014 Report Share Posted June 20, 2014 /* Функция генерации уникальной строки * @var length - длина генерируемой последовательности * Так как я в своем примере использую префикс в 2 символа, * то по молчанию длинна основного ключа: +6 символов * @var chars - набор символов, участвующих в генерации * в наборе может присутствовать что угодно: * $chars = 'ABCDEFGHJKLMNOPQRSTUVWXYZ1234567890' */ function rand_str($length, $chars = '1234567890') { // получаем длину строки символов $chars_length = (strlen($chars) - 1); // Итак, строчка начинается $string = $chars{rand(0, $chars_length)}; // Генерируем for ($i = 1; $i < $length; $i = strlen($string)) { // Берем случайный элемент из набора символов $r = $chars{rand(0, $chars_length)}; // Убеждаемся, что соседние символы не совпадают. if ($r != $string{$i - 1}) $string .= $r; } // Вуаля! return $string; } rand_str(2) Не решит проблему? Quote Link to post Share on other sites
WQP 360 Posted June 20, 2014 Author Report Share Posted June 20, 2014 @mittus, нет. Мне нужно с помощью функции вывести два уникальных числа (функция работает), но при этом удалить определённое число Quote Link to post Share on other sites
r00s 29 Posted June 20, 2014 Report Share Posted June 20, 2014 Сделайте проверку на присутствие не нужного числа, если есть то заново сгенерить. Quote Link to post Share on other sites
nevron 0 Posted June 20, 2014 Report Share Posted June 20, 2014 Сделайте проверку на присутствие не нужного числа, если есть то заново сгенерить. Логично. Quote Link to post Share on other sites
DeimosFobos 34 Posted June 20, 2014 Report Share Posted June 20, 2014 function random($min_num=0, $max_num=1024, $ignore=-1) { $r = mt_rand($min_num, $max_num); if($r == $ignore) return random($min_num, $max_num, $ignore); return $r; } echo random(0,5,5); не делайте random(0,0,0), будет бесконечный цикл! Quote Link to post Share on other sites
Модератор files 2797 Posted June 20, 2014 Модератор Report Share Posted June 20, 2014 Вроде так: <?php $outArray = array(); // хранилище для чисел $max = 10; // максимальное $min = 0; // минимальное $count = 2; // количество чисел $i = 0; // счетчик while($i<$count){ $chislo = mt_rand($min, $max); // генерим if(!in_array($chislo, $outArray)){ // Проверяем уникальность $outArray[$i] = $chislo; // если уникальное, то в массив $i++; } } var_dump($outArray); ?> Quote Link to post Share on other sites
WQP 360 Posted June 20, 2014 Author Report Share Posted June 20, 2014 @r00s, вы не так поняли. Давайте расскажу подробнее. С помощью этого кода у меня получается массив из двух цифр function getFourRandomNumber ($maxCount){ $numbers = range(0, $maxCount); shuffle($numbers); return array($numbers[0], $numbers[1]); } Которые генерируются $numbers = range(0, $maxCount); И из этого массива нужно удалить один элемент. Например: arry(0,1,2,3,4,5,6,7,8,9,10) нужно удалить 6. Quote Link to post Share on other sites
r00s 29 Posted June 20, 2014 Report Share Posted June 20, 2014 Я тоже недавно столкнулся с проблемой удаления элемента массива и переформирования, пришлось функцию писать. Можешь перебрать элементы форичем или фором и переписать в другой массив без 6 элемента Quote Link to post Share on other sites
r00s 29 Posted June 20, 2014 Report Share Posted June 20, 2014 если надо могу написать код. Quote Link to post Share on other sites
DeimosFobos 34 Posted June 20, 2014 Report Share Posted June 20, 2014 Я тоже недавно столкнулся с проблемой удаления элемента массива и переформирования, пришлось функцию писать. Можешь перебрать элементы форичем или фором и переписать в другой массив без 6 элемента для этого есть unset() Quote Link to post Share on other sites
mittus 21 Posted June 20, 2014 Report Share Posted June 20, 2014 И из этого массива нужно удалить один элемент. У вас массив из 2-х чисел. Зачем удалять один из элементов из массива, если вы можете просто использовать нужное число? $numbers[0]; или $numbers[1]; (1 и 2 элементы массива) Quote Link to post Share on other sites
DeimosFobos 34 Posted June 20, 2014 Report Share Posted June 20, 2014 , если все же вы хотите использовать свою функцию, вот вам: function getFourRandomNumber ($maxCount, $unset=null){ $numbers = range(0, $maxCount); if($unset!==null) unset($numbers[$unset]); shuffle($numbers); return array($numbers[0], $numbers[1]); } print_r(getFourRandomNumber(10, 6)); Quote Link to post Share on other sites
ethoz 9 Posted June 20, 2014 Report Share Posted June 20, 2014 function getFourRandomNumber ($maxCount,$unset){ $numbers = range(0, $maxCount); shuffle($numbers); unset($numbers[array_search($unset, array_keys($numbers))]); $numbers = array_values($numbers); return array($numbers[0], $numbers[1]); } Возможно подойдёт Quote Link to post Share on other sites
Legran 106 Posted June 20, 2014 Report Share Posted June 20, 2014 Ого себе оказывается на форуме не простые ребята сидят) Quote Link to post Share on other sites
WQP 360 Posted June 20, 2014 Author Report Share Posted June 20, 2014 @mittus, у меня массив из N чисел просто используются 2 числа. Есть вероятность повтора и её нужно убрать. @DeimosFobos, не работает $query_random_all = $query_random_news->query(array('post_type' => 'page','post_parent' => 33)); $query_random_count = count($query_random_all); function getFourRandomNumber ($maxCount, $unset=null){ $numbers = range(0, $maxCount); if($unset!==null) unset($numbers[$unset]); shuffle($numbers); return array($numbers[0], $numbers[1]); } $arr_all = getFourRandomNumber($query_random_count,0); @ethoz, не работает Quote Link to post Share on other sites
because_ahaha 23 Posted June 20, 2014 Report Share Posted June 20, 2014 function getRandomNumber($maxCount, $remove = false) { $numbers = range(0, $maxCount); if ($remove > 0) unset($numbers[$remove]); return array_rand($numbers, 2); } Quote Link to post Share on other sites
WQP 360 Posted June 20, 2014 Author Report Share Posted June 20, 2014 Вообще нечего не работает... Помогите тогда так. Есть массив Array ( [0] => 0 [1] => 3 [2] => 1 [3] => 2 [4] => 5 [5] => 4 ) из него нужно удалить элемент [1] => 3 Quote Link to post Share on other sites
Модератор files 2797 Posted June 20, 2014 Модератор Report Share Posted June 20, 2014 Вообще нечего не работает... Помогите тогда так. Есть массив Array ( [0] => 0 [1] => 3 [2] => 1 [3] => 2 [4] => 5 [5] => 4 ) из него нужно удалить элемент [1] => 3 Так? $key = array_search(1, $array); if ($key !== false) { unset($array[$key]); } Quote Link to post Share on other sites
WQP 360 Posted June 20, 2014 Author Report Share Posted June 20, 2014 @files, уже пробовал function getFourRandomNumber ($maxCount){ $numbers = range(0, $maxCount); $key = array_search(1, $numbers); if ($key == 1) { unset($numbers[$key]); } shuffle($numbers); return array($numbers[0], $numbers[1]); } Quote Link to post Share on other sites
Модератор files 2797 Posted June 20, 2014 Модератор Report Share Posted June 20, 2014 if ($key == 1) на if ($key !== false) пробовали заменить? Quote Link to post Share on other sites
WQP 360 Posted June 20, 2014 Author Report Share Posted June 20, 2014 @files, да, нечего не поменялось Quote Link to post Share on other sites
DeimosFobos 34 Posted June 20, 2014 Report Share Posted June 20, 2014 WQP, выдает ошибку? Quote Link to post Share on other sites
because_ahaha 23 Posted June 20, 2014 Report Share Posted June 20, 2014 По-моему проблема ТС не в том, что предложенные ф-ции не работают, а в том, что он либо сам не понимает что ему нужно, либо не может этого объяснить. удаление переменных, в том числе элемента массива делается через unset() Quote Link to post Share on other sites
ethoz 9 Posted June 20, 2014 Report Share Posted June 20, 2014 Вы указывайте что не работает конкретно. У меня работает, иначе не постил бы тут. Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.