Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Артём 05.02.2003 21:09 / 05.02.2003 21:38
Вот код класса, который сегдня придумал.#класс, выбирает из любой таблицы, не зависимо от структуры заданное количество случайных #строк. и выдает в результате таблицу, такой же структуры, содержащую заданное количество #случайных строк. Я этот класс стал выдумывать, чтобы на сайте сделать примитивную крутилку #товаров из каталога. #$source_table - исходная таблица #$quant - чило случайных строк # 2003(с) temach. @CLASS revolver #конструктор класса @init[source_table;quant] $self.source_table[$source_table] $self.quant($quant) #таблица с именами столбцов входной таблицы $structure[^source_table.columns[]] #создаем хеш с именами столбцов входной таблицы, где ключами будут номера столбцов $fields[^hash::create[]] #наполняем хэш $fields ^for[i](1;^structure.count[]){ ^structure.offset[set](^eval($i-1)) $fields.$i[$structure.column] } @revolver[][$uslovie] #переменная выключатель, отрубает цыкл ^while , если становится равна 0 $uslovie(1) #копируем структуру исходной таблицы (thanx to Misha v.3) $result[^source_table.select(0)] ^while($uslovie){ ^source_table.offset[set](^math:random(^source_table.count[])) #создаем хеш со значениями столбцов текущей(уже случайной)строки входной таблицы, #где ключами будут номера столбцов $values[^hash::create[]] # #наполняем хэш values ^for[i](1;^structure.count[]){ $values.$i[$source_table.[$fields.$i]] } # #определяем начальное значение add $add[$values.1] # #создаем строку для добавления в конечную таблицу ^for[i](2;^structure.count[]){ $add[$add $values.$i] } ^if(^result.count[] >= $quant){ # #останавливаем набор случайных строк в табл. $result $uslovie(0) }{ # #и наконец-то добавляем нашу строчку в таблицу $result ^result.append{$add} } } # к примеру исходная таблица (c)Egr. #$items[^table::create{id parent_id dir title #1 0 hardware Железо #11 1 computers Компьютеры #12 1 printers Принтеры #121 12 laser Лазерные #122 12 ink Струйные #2 0 software Программное обеспечение #21 2 os Операционные системы #22 2 editors Текстовые редакторы #3 0 news Новости}] #создаем объект и получаем таблицу #$object[^revolver::init[$items;5]] #$tbl[^object.revolver[]] #что можно усовершенствовать(что пришло на ум): #1.проверять таблицу результатов чтобы не было совпадений # из наблюдений - чем меньше строк в исходной таблице, # тем больше вероятнсть появления строк близнецов # в таблице результатов #2.сделать так, чтобы по умолчанию отбиралась одна строчка, # т.е. если параметр $quant не определен