Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Нужно выбрать один случайный!!! элемент массива


Автор: slang 9.6.2007, 05:06
Не могу сообразить как реализовать такую весчь...
Есть многомерный ассоциативный массив, например test[kod][name]. В нем могут повторяться name (одно название теста для нескольких вариантов). Мне необходимо оставить один элемент массива из повторяющихся, при этом это должен быть СЛУЧАЙНЫЙ выбор, а не результат array_unique().

Автор: slang 9.6.2007, 06:57
Вроде "дошло", как это сделать, по крайней мере на стадии алгоритма вроде понятно:
1. Выбрать из БД список тестов (только наименование) в массив test_name
2. Удалить повторяющиеся значения из массива test_name
3. Выбрать из БД все элементы, равные test_name(n) и занести в массив test_id значения id из БД
4. Перемешать элементы массива test_id
5. Вернуть значение первого элемента test_id для вывода теста
6. Перейти к 3-му пункту

Автор: Golda 9.6.2007, 19:40
см. http://www.php.net/manual/en/function.array-rand.php

Автор: slang 10.6.2007, 08:11
Вот, примерно, что получается:
Код

function test_list()    {
// Список тестов с сылками на них
    print ("<BR><BR>Выберите, пожалуйста, тест:");
    // Получение списка названий тестов
    $sql_t = "SELECT name FROM test WHERE vopros_this=0 AND otvet_this=0";
    db_query($sql_t);
    while ($test_name = mysql_fetch_array($sql_t)){
        $test_n[] = $test_name['name'];
    }
    $test_name = array_unique($test_n);
    foreach ($test_name as $name)    {
        $sql_t = "SELECT * FROM test WHERE id=" . id_test($name);
        db_query($sql_t);
        while ($test = mysql_fetch_assoc($sql_t)) {
            if ($test['vopros_this'] == "0" && $test['otvet_this'] == "0")    {
                print "<BR><B><a href='?test=" . $test['test_this'] . "'>". $test['name'] . "</a></B>";
            }
        }
    }
}
function id_test($test_name)    {
    $sql_t = "SELECT id FROM test WHERE name='" . $test_name . "'";
    db_query($sql_t);
    while ($test_id = mysql_fetch_array($sql_t)){
        $t_id[]=$test_id['id'];
    }
    srand ((float)microtime()*1000000);
    shuffle($t_id);
    return $t_id[0];    
}

array_rand - удобная функция, но в моем случае, она заменяет только последние две строки последней функции:
Код

    shuffle($t_id);
    return $t_id[0];

так как она ведь не может выбрать случайное среди повторяющихся smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)