|
|
|
| существует ли относительно простой способ сделать 3 случайных непоторяющихся числа из данных? к примеру дан массив $s = array(1,3,5,6,4,56,23,98,15) и из него надо взять три случайных разных числа? | |
|
|
|
|
|
|
|
для: RV
(15.10.2005 в 11:59)
| |
<?
srand ((float) microtime() * 10000000);
$s = array (1, 3, 5, 6, 4, 56, 23, 98, 15);
/*
mixed array_rand (array input [, int num_req])
array_rand() может пригодиться, если вы захотите извлечь из массива одно или более
произвольно выбранных вхождений. Функция принимает массив input и необязательный
аргумент num_req, который специфицирует, сколько вхождений вы хотите извлечь - если
не специфицирует, по умолчанию будет 1.
Если вы извлекаете только одно вхождение, array_rand() возвращает ключ произвольного
вхождения. Иначе возвращает массив ключей для случайных вхождений. Таким образом вы
можете извлечь из массива случайно выбранные ключи и значения.
Не забудьте вызвать srand() для включения генератора случайных чисел.
*/
$r = array_rand ($s, 3);
print_r ($r);
?>
|
| |
|
|
|
|
|
|
|
для: localGhost
(15.10.2005 в 12:25)
| | А если в массиве будут повторятся значения?
$s = array (1, 3, 5, 6, 4, 5, 3, 8, 1); | |
|
|
|
|
|
|
|
для: OZ_
(15.10.2005 в 12:55)
| | вы про начальный массив?.. и что страшного если будут повтаряться?.. не понял немного сути...
тиоретически можно просто получить в ответе несколько равных значений.. | |
|
|
|
|
|
|
|
для: localGhost
(15.10.2005 в 13:11)
| | так. в массиве не будет повторяющихся значений. и я это сделал вот так:
<?
error_reporting('E_ALL');
if ($handle = opendir('banners'))
{
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != "..")
{
$arr[] = $file;
}
}
closedir($handle);
}
shuffle($arr); // перемешиваем массив
$first = array_shift($arr); // удаляем из массива первый элемент и показываем его
$first = explode("." , $first);
$first = $first[0]; // там имя файла, а мне нуно только имя без расширения
shuffle($arr);
$second = array_shift($arr);
$second = array_shift($arr);
$second = explode("." , $second);
$second = $second[0];
shuffle($arr);
$third = array_shift($arr);
$third = array_shift($arr);
$third = explode("." , $third);
$third = $third[0];
?>
|
вот так. всем спасибо | |
|
|
|
|
|
|
|
для: localGhost
(15.10.2005 в 13:11)
| | Припозднился с кодом, но не зря ж писал. Может кому пригодится :)
Он поуниверсальнее.
<?
$s = array (1, 3, 5, 6, 4, 5, 3, 8, 1);
$n=array();
$c=count($s);
$vars=3; //нужно 3 элемента
for ($i=0;$i<$vars;$i++)
{
$rnd=array_rand($s);
if (!in_array($rnd,$n)) $n[$i]=$rnd;
else
{
$founded=false;
for ($j=0;$j<$c;$j++)
{
if (!in_array($s[$j]) and $s[$j]!=$rnd)
{
$n[$i]=$s[$j];
$founded=true;
break;
}
}
if (!$founded)
{
print "Недостаточно различных элементов массива для выбора ".$vars." случайных.";
break;
}
}
}
print_r($n);
?>
|
| |
|
|
|
|
|
|
|
для: OZ_
(15.10.2005 в 13:27)
| | Чтоб не повторялось? пожалуйста........
<?
srand ((float) microtime() * 10000000);
$s = array (1, 3, 5, 6, 4, 5, 3, 8, 1);
$r = array_rand (array_unique ($s), 3);
print_r ($r);
?>
|
только в данном случае есть небольшое ограничение: функция array_unique () почему-то отсутствует в версии PHP 4.0.4. | |
|
|
|