[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: random из массива средствами php
Dima85
$i=0;
while ($rows2 = mysql_fetch_assoc($rows)){
$datetime2 = date("Y-m-d H:i:s", strtotime('last Monday'));
if(strtotime($rows2['CTime']) > strtotime($datetime2)) {
$i++;
echo $i.' '.$rows2['CUser'].'<br>';
}
}


Вот так у меня выводится массив. Подскажите как в самом конце вывести 1 раз $rows2['CUser'] случайным образом из тех что повторяется в массиве. Предложения средствами MySQL не интересуют.
sergeiss
Цитата (Dima85 @ 26.07.2015 - 17:55)
случайным образом из тех что повторяется в массиве

Если я правильно понял задачу... То сделал бы так:
1. Сохранить в отдельный массив все исходные данные, подсчитывая их количество.
2. По выходу из цикла оставить в массиве только те величины, что повторяются.
3. Использовать shuffle() для перемешивания массива.
4. Взять первый элемент smile.gif

В качестве варианта, можно пп.3-4 сделать по-другому
3. Получить случайное число средствами ПХП, в диапазоне с индексами массива из п.2
4. Взять это число в качестве индекса для элемента массива.

5. Профит smile.gif Результат получен.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Dima85
Сделал, спасибо за идею
kaww
3 и 4 пункт можно заменить функцией array_rand.
Или вообще обойтись без дополнительного массива, но с двумя переменными:
$i = $ri = 0;
$r = rand(0, mysql_num_rows($rows) - 1);
$datetime2 = date("Y-m-d H:i:s", strtotime('last Monday'));
while (($rows2 = mysql_fetch_assoc($rows))){
if($r == $ri)
$randomUser = $rows2['CUser'];
++
$ri;
if(strtotime($rows2['CTime']) > strtotime($datetime2)) {
$i++;
echo $i.' '.$rows2['CUser'].'<br>';
}
}

echo $randomUser;

З.Ы. datetime2 можно вынести за тело цикла, а вполне вероятно, что и в sql запрос.
Dima85
А я сделал вот так: Скажите чей вариант лучше, мой или kaww.

$i=0;
while ($rows2 = mysql_fetch_assoc($rows)){
$datetime2 = date("Y-m-d H:i:s", strtotime('last Monday'));
if(strtotime($rows2['CTime']) > strtotime($datetime2)) {
$i++;
$arr[$i] = $rows2['CUser'];
}
}


$win = rand(1, $i);
$win = $arr[$win];

sergeiss
Dima85, в твоем варианте можно смело выкинуть переменную $i. И плюс к этому, я не понял, почему ты в запросе не написал условие на время? Покажи, что у тебя за запрос. Скорее всего, его можно оптимизировать.
И еще. Ты перезаписываешь переменную $win, используешь ее для совершенно разных целей. С технической точки зрения в этом нет проблемы, но это не совсем "красиво".

Я бы упростил твой код до такого (с учетом того, что в запросе сразу получаем только нужные строки)
while ($rows2 = mysql_fetch_assoc($rows)){
$arr[] = $rows2['CUser'];
}

$win = $arr[ rand(0,mysql_num_rows($rows-1) ) ];

Ключи массива $arr будут автоматически пронумерованы от 0 до (количество строк минус 1).

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.