Разбор прайса на категории и товар

hsasha

Новичок
Разбор прайса на категории и товар

Здравствуйте :)

Есть файлик с товарами, (пример):
PHP:
"Процессоры";"Процессоры"                                                                                                                              
"";"AMD"                                                                                  
"";"Socket AM2"
"34561";"proc1"                                                                           
"6571";"proc2"
"";"Socket AM3"
"561";"proc1"
"5631";"proc2"                                                                           
"";"Intel®"                                                                               
"";"Celeron® Socket775"
"67818";"proc1"
"46741";"proc2"
"Мониторы";"Мониторы"
....... и т.д.
То что я делал:
PHP:
$file = file ( '/var/www/shop/price.txt' );
$count = count ( $file );
$tmp = 0;
for($i = 0; $i < $count; $i ++) {
	$ar = explode ( ';', $file [$i] );
	$ar[0] = $Code;
	$ar[1] = $Name;
	if (preg_match ( '#[^0-9]+#Uis', $Code  )) {
		//MainCat		
		print $Name . "\n";
	
	} elseif ($Code == '') {
		
		$tmp ++;
		if ($tmp > 1) {
			//SecondCat	
			print "--" . $Name  . "\n";
		} else {
			//ThirdCat	
			print "----" . $Name  . "\n";
		}
	
	} else {
		//Tovar	
		print "---------" . $Name  . "\n";
		unset ( $tmp );
	}

}
А мне нужен вывод:
PHP:
Процессоры
                    AMD
                           SocketAM2
                                             proc1
                                             proc2
                    Intel
                           Celeron® Socket775
                                                            proc1
                                                            proc2
Мониторы
....
Подскажите как реализовать правильно :)
 

hsasha

Новичок
Ну вот кусок с файла, точные имена не привожу, ибо они не очень читабельны, структура такая же
PHP:
"Процессоры";"Процессоры"   // главная категория                                                                                                                           
"";"AMD"                                    // Подкатегория главной                                            
"";"Socket AM2"                         // Категория подкатегории
"34561";"proc1"                        //товар                                                           
"6571";"proc2"                          //товар
"";"Socket AM3"                          // Категория подкатегории
"561";"proc1"                             //товар
"5631";"proc2"                           //товар                                                
"";"Intel®"                                 //  Подкатегория главной                                             
"";"Celeron® Socket775"           // Категория подкатегории
"67818";"proc1"                         //товар
"46741";"proc2"                         //товар
"Мониторы";"Мониторы"           // главная категория
 

dimagolov

Новичок
таки да, только ручками:
как определить что "";"Intel®" это подкатегория "Процессоры";"Процессоры", а не "";"Socket AM3" или "";"AMD"?

хотя... если ограничить вложенность категорий 2-я уровнями и требовать, чтобы категория 1-го уровня ("";"AMD") не могла содержать товаров, то можно и разрулить:
1. категории 0-го уровня определять по совпадению имен в паре код-имя
2. категории 1-го и 2-го уровня имеют пустую строку в коде
3. категория 1-го уровня имеет следующей строку категории 2-го уровня, иначе это категория 2-го уровня
 

hsasha

Новичок
Та ну, нах, там 8000 наименования и меняются каждый день :confused:
 

damngood

Мозг был, но ушел...
hsasha
Значит вводи или какие-то отступы, или как-то дополняй идентификаторами id-parentid исходный файл
 

hsasha

Новичок
Если бы я генерировал исходный файл то так бы и сделал :)
 

damngood

Мозг был, но ушел...
Ну чисто теоретически твою проблему решить можно, суть такая.

Если файл имеет структуру:

"Процессоры";"Процессоры" // главная категория
"";"AMD" // Подкатегория главной
"";"Socket AM2" // Категория подкатегории
"34561";"proc1" //товар
"6571";"proc2" //товар

Тут главное понять то, что у подкатегории всегда пустота в первый кавычках. А у товара всегда в первой части кавычек - целочисленный id.

Дальше написать парсер думаю не сложно, если там все упорядочено нормально. Понятно как писать? Или дальше сказать?)

-~{}~ 26.11.09 18:08:

UPDATE: Но это раскидает категории не далее 2го уровня, то есть не решит проблемы "";"Socket AM2" // Категория подкатегории
 

hsasha

Новичок
В принципе идентификатор есть, подкатегории идут две подряд:
"";"AMD"
"";"Socket AM2"

но узнать можно это только после того как запишется первая (в моем случае есле $tmp равно 2, то первая из них это категория главной). Но как вернуть цикл назад на 1 шаг и пометить хз :)
 

damngood

Мозг был, но ушел...
Ну по идее пропарси тогда так:

Так как товар есть только у конечной категории, то если идут две подряд категории с первыми пустыми кавычками - то вторая это подкатегория категории главной категории. =) Ну ты понял, то есть категория второго уровня.
 

Adelf

Administrator
Команда форума
Цикл назад не возвращай. а просто заглядывай на шаг вперед в нужных ситуациях.
 

hsasha

Новичок
да, это я понял ))
"";"AMD" --- $tmp =1
"";"Socket AM2" ----$tmp =2 (Узнали что предыдущая есть категория, но как вернутся пометить "";"AMD"?)

Я наверное переработал, ибо тут мой моск вскипает :)

-~{}~ 26.11.09 18:19:

Автор оригинала: Adelf
Цикл назад не возвращай. а просто заглядывай на шаг вперед в нужных ситуациях.
Почти понял :), еще один проверочный цикл пустить внутри этого?
 

Adelf

Administrator
Команда форума
да не.
я думал ты сначала файл в массив загрузил функцией..

Как вариант без предварительной загрузки:
ну с мониторами и процессорами понятно - это категории нулевого уровня.
Далее -
при встрече с пуcтым id - закидывай значение в переменную и в флажке отмечаем - у нас есть коечто в переменной.
перед каждой итерацией смотрим - есть ли у нас чтото во флажке, если есть значит дожидается своей участи категория. И если текущий id тоже пустой - значит та категория, которая дожидается - первого уровня. Если id есть - это товар, значит та категория - второго уровня.
Както так.

З.Ы. сам недавно грузил в базу файл с 57 позициями в каждом строке, затрагивая 10 таблиц.. Файл от неназываемого мне источника :) Бывает разное.. поэтому не будем судить за качество импортированного файла.
 

hsasha

Новичок
Ну да, это так, но не могу правильно написать.
Цикл то уже пройдет категорию которая нам нужна, а потом только узнаем что она была. А ее нужно пометить что это ты должна быть категорией.... я уже сам не понял что написал :)
 

dimagolov

Новичок
я думал ты сначала файл в массив загрузил функцией..
не советуй плохого. потом у него кончится память.

ничего не мешает читать на одну строку больше, чем обрабатываем, просто всегда в наличии будет 2 строки прочитанных и по ним мы решаем вопрос с 1-2 уровнем вложенности.

вообще-то меня удивляют такие дебаты после моего первого поста в этой теме, я там дал формализацию, т.е. по факту алгоритм
 

hsasha

Новичок
Да, я туплю можно ж посотреть на шаг вперед, есле тоже пустой ID то это есть категория))

P.S. Одна голова хорошо, а много - лучше )

P.P.S Просто +1 и сверяем кому пригодится :)
PHP:
$ar_test = explode ( ';', $file [$i + 1] );
 
Сверху