parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Всем парсеристам. Смотрите, что получилсь. Принимается любая критика, советы, идеи, деньги :) (тока не матерится)

Артём 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 не определен