задал себе задачку три дня назад, уже долблюсь с ней и бросать не хочется и до конца дойти не могу подскажите пжл, кто может знает как такое сделать Вообщем суть её: 1. Парисим XML (параметры парсера я ложу в массив) 2. Каким-то образом нужно сделать сортировку (динамичискую) с учетом дочерних категорий а те в свою очередь должны сортировать себя 3. Вывод (Не важен, главно массив получить правельный) HTML: <?xml version="1.0" encoding="windows-1251"?> <catalog> <category id="1">phone</category> <category id="2">card</category> <category id="3">photo</category> <category id="1026" parentID="1">iPhone</category> <category id="1001" parentID="1">Motorola</category> <category id="1002" parentID="1">Nokia</category> <category id="1003" parentID="1">Samsung</category> <category id="1004" parentID="1">Sony Ericsson</category> <category id="1034" parentID="1">LG</category> <category id="1006" parentID="2">MicroSD</category> <category id="1010" parentID="2">RS MMC</category> <category id="1032" parentID="2">Transcend SD</category> <category id="1040" parentID="2">Compact Flash</category> <category id="1041" parentID="2">Secure Digital</category> <category id="1024" parentID="2">USB FlashCard</category> <category id="1029" parentID="3">Kodak</category> <category id="1028" parentID="3">Nikon</category> <category id="1012" parentID="3">Olympus</category> <category id="1025" parentID="3">Panasonic</category> <category id="1013" parentID="3">Samsung</category> <category id="1014" parentID="3">Sony CyberShot</category> </catalog> PHP: <?php // Это настроки по которым будет парсится XML $arr_category = array("catalog" => array("category/@id" => 1, "category/@parentID" => 2, "category" => 3)); $i=0; $xml = simplexml_load_file('data.xml'); // грузим // тут мы подставляем настроки для xpath (шоб как бы динамически) foreach($arr_category as $key => $item){ foreach($item as $name => $col){ $query[$i] .= '//'.$key.'/'.$name; $i++; } } $k=0; $sss = array(); // тут исполняем запрос foreach($query as $key => $val){ $list=$xml->xpath($val); $sss[$k] = $list; $k++; } // получем $sss как массив а вот дальше запара... каким образом мне нужно построить массив? я не прошу готового решения мне б ток направление... я думал, принимать id как ключ а значение будет parentID (а так как я хочу, что б было динамически то parentID долежн принимать свой парент а тот парент свой... ) а в конце иметь значение но как такое правильно построить я не знаю Вот как бы результат желаемый... Код (Text): phone iPhone Motorola Nokia Samsung Sony Ericsson LG card MicroSD RS MMC Transcend SD Compact Flash Secure Digital USB FlashCard photo Kodak Nikon Olympus Panasonic Samsung Sony CyberShot
PHP: $sss = array( 'phone(parent1)' => array( 0 => array( 'id' => 'element_categoey_id', 'title' => 'element_name' ), 1 => array( 'id' => 'element_categoey_id', 'title' => 'element_name' ), 2 => array( 'id' => 'element_categoey_id', 'title' => 'element_name' )..... ), 'card(parent2)' => array( 0 => array( 'id' => 'element_categoey_id', 'title' => 'element_name' ), 1 => array( 'id' => 'element_categoey_id', 'title' => 'element_name' ), 2 => array( 'id' => 'element_categoey_id', 'title' => 'element_name' )..... ), 'photo(parent3)' => array( 0 => array( 'id' => 'element_categoey_id', 'title' => 'element_name' ), 1 => array( 'id' => 'element_categoey_id', 'title' => 'element_name' ), 2 => array( 'id' => 'element_categoey_id', 'title' => 'element_name' )..... )... );
ЗЫ если не хотите разбираться в моем коде, подскажите как правильно заполнить массив рекурсивно СПАСИБО up продолжение той сортировки............... помогите, я шото вообще запутался, как правильно заполнить рекурсивно массив? вот код который делает: 1. Вытигавает все id с тех категорий которые не имеют parentid 2. Передает результат в рекурсивную 3. Потом если это массив а при первом заходе так и будет то сделать ID категорий ключами а в содержание поместить name -> имя категории, потом запускаем рекурсивную но где-то там на 3-м шаге прокол, помогите пжл... PHP: <?php function utf8encode($str,$encode="WINDOWS-1251") { return iconv($encode,'UTF-8',$str); } function utf8decode($str,$encode="WINDOWS-1251") { return iconv('UTF-8',$encode,$str); } function dump($arr,$mode=false,$stop=false) { echo "<pre>"; (!$mode) ? print_r($arr) : var_dump($arr); echo "</pre>"; $stop ? exit() : ""; } /////////////// // Настройки для xpath $arr_category = array("catalog" => array("category/@id" => 1, "category/@parentID" => 2, "category" => 3)); $i=0; $xml = simplexml_load_file('data.xml'); // создаем массив запросов foreach($arr_category as $key => $item){ foreach($item as $name => $col){ $query[$i] .= '//'.$key.'/'.$name; $i++; } } // извлекаем все то шо не равно парент айди $query_cat = "//catalog/category[not(@parentID)]"; // выполняем $list=$xml->xpath($query_cat); // Если не пустой if(!empty($list)){ function recurs($r,$res,$xml,$p){ /* $r - первый запрос $res - как бы тот массив который я хочу получить... $xml - xml $p - id категории */ if(is_array($r)) { for ($q=0;$q<count($r);$q++){ $id = (string)$r[$q]->attributes(); $res[$id]['name'] = utf8decode("$r[$q]\r\n"); dump($res); recurs(false,$res,$xml,$id); } } else { $list2[] = $xml->xpath("//catalog/category[@parentID='".trim($p)."']"); for ($w=0;$w<count($list2);$w++){ $name = (string)$list2[0][$w]; $res[$p][$id]['name'] = $name; $id = (string)@$list2[0][$w]->attributes(); if($id) { recurs(false,$res,$xml,$id); } } } } $tt = recurs($list,false,$xml,false); } else { /* ... */ } HTML: XML <?xml version="1.0" encoding="windows-1251"?> <catalog> <category id="1" >Communication</category> <category id="2" >TV</category> <category id="3" parentID="2">DVD</category> <category id="4" parentID="3">blueray</category> <category id="5" parentID="3">cd</category> <category id="6" parentID="3">dvd</category> <category id="7" parentID="1">Mobile</category> <category id="8" parentID="7">iPhone</category> <category id="9" parentID="7">Nokia</category> </catalog> хочу такое в итоге получить, но получаю, что-то не так т.к. видимо я не правильно передаю результат и он как бы сам себя затирает.... Код (Text): Array ( [1] => Array ( [name] => Communication [7] => Array ( [name] => Mobile [7] => Array ( [name] => iPhone [name] => Nokia ) ) ) [2] => Array ( [name] => TV [3] => Array ( [name] => DVD [] => Array ( [name] => blueray [name] => cd [name] => dvd ) ) ) )
up ну люди, вы же профи, подскажите как правильно заполнить рекурсивно массив у меня 2-а шага выходит потом, нужно передавать путь, что б при дальнейшем рекурсивном добавлении в массив оно знало куда добавить значение. но я не могу сообразить как, ХЕЛП!!!!!!!!!!!!!!!!!!!!
наконец то... может кому понадобится Решение: PHP: <?php set_error_handler("Handler"); function Handler($errno,$errstr,$errfile,$errline){ if(error_reporting()){ $errors=array( E_ERROR => 'Error', E_WARNING => 'Warning', E_PARSE => 'Parsing Error', E_CORE_ERROR => 'Core Error', E_CORE_WARNING => 'Core Warning', E_COMPILE_ERROR => 'Compile Error', E_COMPILE_WARNING => 'Compile Warning', E_USER_ERROR => 'User Error', E_USER_WARNING => 'User Warning',); if(array_key_exists($errno,$errors)){ die("<b>Тип:</b> ".$errors[$errno]."\r\n<br><b>Текст:</b> {$errstr}\r\n<br><b>Файл:</b> {$errfile}\r\n<br><b>Строка:</b> {$errline}"); } } } function utf8encode($str,$encode="WINDOWS-1251") { return iconv($encode,'UTF-8',$str); } function utf8decode($str,$encode="WINDOWS-1251") { return iconv('UTF-8',$encode,$str); } function dump($arr,$mode=false,$stop=false) { echo "<pre>"; (!$mode) ? print_r($arr) : var_dump($arr); echo "</pre>"; $stop ? exit() : ""; } $arr_category = array("catalog" => array("category/@id" => 1, "category/@parentID" => 2, "category" => 3)); $i=0; $xml = simplexml_load_file('test2.xml'); foreach($arr_category as $key => $item){ foreach($item as $name => $col){ $query[$i] .= '//'.$key.'/'.$name; $i++; } } //dump($query); // Сделано только для того XML - который обозначает корни без parentID $query_cat = "//catalog/category[not(@parentID)]"; $arr=$xml->xpath($query_cat); if(!empty($arr)){ function recurseTree (&$tree, $arr, $xml) { function recurseArr (&$tree, $xml, $netxid, $i) { //echo $i; $arr = $xml->xpath("//catalog/category[@parentID='".trim($netxid)."']"); //dump($arr); foreach ($arr as $j => $key1) { //dump($key1); $atr = $key1->attributes(); //dump($atr); $id = $atr['id']; $parentid = $atr['parentid']; //echo $k." - ".$v." - ".$tree [$i]['id']."<br>"; if(count($arr)>1){ $tree [$i] ['str']['name'][(int)$id] = utf8decode("$key1"); } else { $tree[$i]['sub']['id'] = (int)$id; $tree [$i] ['sub']['name'] = utf8decode("$key1"); } //unset($arr [$j] ); // dump($tree); recurseArr ($tree [$i] ['sub'], $xml,$id,$j); } return false; } for ($i=0; $i< count($arr); $i++) { $tree[$i]['id'] = (string)$arr[$i]->attributes(); $tree[$i]['name'] = utf8decode("$arr[$i]"); recurseArr ($tree, $xml, $tree[$i]['id'],$i); } //dump($tree); } $tree = array(); recurseTree ($tree, $arr, $xml); dump($tree); } else { /* ... */ } ?>