За последние 24 часа нас посетили 213305 программистов и 2229 роботов. Сейчас ищут 1623 программиста ...

сортировка...

Тема в разделе "PHP для новичков", создана пользователем alexeurodnepr, 19 июн 2009.

  1. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    задал себе задачку три дня назад, уже долблюсь с ней и бросать не хочется и до конца дойти не могу подскажите пжл, кто может знает как такое сделать

    Вообщем суть её:
    1. Парисим XML (параметры парсера я ложу в массив)
    2. Каким-то образом нужно сделать сортировку (динамичискую) с учетом дочерних категорий а те в свою очередь должны сортировать себя
    3. Вывод (Не важен, главно массив получить правельный)

    HTML:
    1.  
    2. <?xml version="1.0" encoding="windows-1251"?>
    3. <catalog>
    4.     <category id="1">phone</category>
    5.     <category id="2">card</category>
    6.     <category id="3">photo</category>
    7.     <category id="1026" parentID="1">iPhone</category>
    8.     <category id="1001" parentID="1">Motorola</category>
    9.     <category id="1002" parentID="1">Nokia</category>
    10.     <category id="1003" parentID="1">Samsung</category>
    11.     <category id="1004" parentID="1">Sony Ericsson</category>
    12.     <category id="1034" parentID="1">LG</category>
    13.     <category id="1006" parentID="2">MicroSD</category>
    14.     <category id="1010" parentID="2">RS MMC</category>
    15.     <category id="1032" parentID="2">Transcend SD</category>
    16.     <category id="1040" parentID="2">Compact Flash</category>
    17.     <category id="1041" parentID="2">Secure Digital</category>
    18.     <category id="1024" parentID="2">USB FlashCard</category>
    19.     <category id="1029" parentID="3">Kodak</category>
    20.     <category id="1028" parentID="3">Nikon</category>
    21.     <category id="1012" parentID="3">Olympus</category>
    22.     <category id="1025" parentID="3">Panasonic</category>
    23.     <category id="1013" parentID="3">Samsung</category>
    24.     <category id="1014" parentID="3">Sony CyberShot</category>
    25. </catalog> 
    26.  
    PHP:
    1.  
    2. <?php
    3. // Это настроки по которым будет парсится XML
    4. $arr_category = array("catalog" => array("category/@id" => 1,
    5.                                   "category/@parentID" => 2,
    6.                                   "category" => 3));
    7.  
    8.  
    9. $i=0;
    10. $xml = simplexml_load_file('data.xml'); // грузим
    11.  
    12. // тут мы подставляем настроки для xpath (шоб как бы динамически)
    13. foreach($arr_category as $key => $item){
    14.     foreach($item as $name => $col){
    15.         $query[$i] .= '//'.$key.'/'.$name;
    16.         $i++;
    17.     }
    18. }  
    19.    
    20. $k=0;
    21. $sss = array();
    22.  
    23. // тут исполняем запрос
    24. foreach($query as $key => $val){
    25.     $list=$xml->xpath($val);
    26.     $sss[$k] = $list;
    27.     $k++;
    28. }
    29.  
    30. // получем $sss как массив
    31.  
    32.  
    а вот дальше запара...

    каким образом мне нужно построить массив? я не прошу готового решения мне б ток направление...

    я думал, принимать id как ключ а значение будет parentID (а так как я хочу, что б было динамически то parentID долежн принимать свой парент а тот парент свой... ) а в конце иметь значение

    но как такое правильно построить я не знаю :(

    Вот как бы результат желаемый...

    Код (Text):
    1.  
    2. phone
    3.    iPhone
    4.    Motorola
    5.    Nokia
    6.    Samsung
    7.    Sony Ericsson
    8.    LG
    9. card
    10.    MicroSD
    11.    RS MMC
    12.    Transcend SD
    13.    Compact Flash
    14.    Secure Digital
    15.    USB FlashCard
    16. photo
    17.    Kodak
    18.    Nikon
    19.    Olympus
    20.    Panasonic
    21.    Samsung
    22.    Sony CyberShot
     
  2. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    PHP:
    1. $sss = array(
    2.     'phone(parent1)' => array(
    3.          0 => array(
    4.              'id' => 'element_categoey_id',
    5.              'title' => 'element_name'
    6.          ),
    7.          1 => array(
    8.              'id' => 'element_categoey_id',
    9.              'title' => 'element_name'
    10.          ),
    11.          2 => array(
    12.              'id' => 'element_categoey_id',
    13.              'title' => 'element_name'
    14.          ).....
    15.     ),
    16.     'card(parent2)' => array(
    17.          0 => array(
    18.              'id' => 'element_categoey_id',
    19.              'title' => 'element_name'
    20.          ),
    21.          1 => array(
    22.              'id' => 'element_categoey_id',
    23.              'title' => 'element_name'
    24.          ),
    25.          2 => array(
    26.              'id' => 'element_categoey_id',
    27.              'title' => 'element_name'
    28.          ).....
    29.     ),
    30.     'photo(parent3)' => array(
    31.          0 => array(
    32.              'id' => 'element_categoey_id',
    33.              'title' => 'element_name'
    34.          ),
    35.          1 => array(
    36.              'id' => 'element_categoey_id',
    37.              'title' => 'element_name'
    38.          ),
    39.          2 => array(
    40.              'id' => 'element_categoey_id',
    41.              'title' => 'element_name'
    42.          ).....
    43.     )...
    44. );
     
  3. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    ЗЫ если не хотите разбираться в моем коде, подскажите как правильно заполнить массив рекурсивно :) СПАСИБО

    up :) продолжение той сортировки...............

    помогите, я шото вообще запутался, как правильно заполнить рекурсивно массив?

    вот код который делает:
    1. Вытигавает все id с тех категорий которые не имеют parentid
    2. Передает результат в рекурсивную
    3. Потом если это массив а при первом заходе так и будет то сделать ID категорий ключами а в содержание поместить name -> имя категории, потом запускаем рекурсивную но где-то там на 3-м шаге прокол, помогите пжл...



    PHP:
    1.  
    2. <?php
    3. function utf8encode($str,$encode="WINDOWS-1251")
    4. {
    5.     return iconv($encode,'UTF-8',$str);
    6. }
    7.  
    8. function utf8decode($str,$encode="WINDOWS-1251")
    9. {
    10.     return iconv('UTF-8',$encode,$str);
    11. }
    12.  
    13. function dump($arr,$mode=false,$stop=false)
    14. {  
    15.     echo "<pre>";
    16.     (!$mode) ? print_r($arr) : var_dump($arr);
    17.     echo "</pre>";
    18.     $stop ? exit() : "";
    19. }
    20. ///////////////
    21. // Настройки для xpath
    22. $arr_category = array("catalog" => array("category/@id" => 1,
    23.                                          "category/@parentID" => 2,
    24.                                          "category" => 3));    
    25.  
    26. $i=0;
    27. $xml = simplexml_load_file('data.xml');
    28. // создаем массив запросов
    29. foreach($arr_category as $key => $item){
    30.     foreach($item as $name => $col){
    31.         $query[$i] .= '//'.$key.'/'.$name;
    32.         $i++;
    33.     }
    34. }
    35.  // извлекаем все то шо не равно парент айди
    36. $query_cat = "//catalog/category[not(@parentID)]";
    37. // выполняем
    38. $list=$xml->xpath($query_cat);
    39. // Если не пустой
    40. if(!empty($list)){
    41.        
    42.     function recurs($r,$res,$xml,$p){
    43.         /*
    44.         $r - первый запрос
    45.         $res - как бы тот массив который я хочу получить...
    46.         $xml - xml
    47.         $p - id категории
    48.  
    49.         */
    50.     if(is_array($r)) {
    51.  
    52.         for ($q=0;$q<count($r);$q++){
    53.             $id =  (string)$r[$q]->attributes();
    54.             $res[$id]['name'] =  utf8decode("$r[$q]\r\n");
    55.             dump($res);
    56.             recurs(false,$res,$xml,$id);
    57.            
    58.         }
    59.        
    60.    
    61.     } else {
    62.          
    63.         $list2[] = $xml->xpath("//catalog/category[@parentID='".trim($p)."']");
    64.  
    65.         for ($w=0;$w<count($list2);$w++){
    66.             $name = (string)$list2[0][$w];
    67.            
    68.             $res[$p][$id]['name'] = $name;
    69.             $id =  (string)@$list2[0][$w]->attributes();
    70.             if($id) {
    71.                 recurs(false,$res,$xml,$id);   
    72.             }
    73.         }
    74.     }
    75.        
    76.     }
    77.        
    78.     $tt = recurs($list,false,$xml,false);
    79.    
    80. } else {
    81.     /* ... */
    82. }
    83.  
    HTML:
    1.  
    2. XML
    3. <?xml version="1.0" encoding="windows-1251"?>
    4. <catalog>
    5.     <category id="1" >Communication</category>
    6.     <category id="2" >TV</category>
    7.     <category id="3" parentID="2">DVD</category>
    8.     <category id="4" parentID="3">blueray</category>
    9.     <category id="5" parentID="3">cd</category>
    10.     <category id="6" parentID="3">dvd</category>
    11.     <category id="7" parentID="1">Mobile</category>
    12.     <category id="8" parentID="7">iPhone</category>
    13.     <category id="9" parentID="7">Nokia</category>
    14. </catalog>
    15.  
    хочу такое в итоге получить, но получаю, что-то не так т.к. видимо я не правильно передаю результат и он как бы сам себя затирает....
    Код (Text):
    1.  
    2. Array
    3. (
    4.     [1] => Array
    5.         (
    6.             [name] => Communication
    7.  
    8.             [7] => Array
    9.                 (
    10.                     [name] => Mobile
    11.                      [7] => Array
    12.                     (
    13.                         [name] => iPhone
    14.                         [name] => Nokia
    15.                     )
    16.                 )
    17.  
    18.         )
    19.        
    20.     [2] => Array
    21.         (
    22.             [name] => TV
    23.  
    24.             [3] => Array
    25.                 (
    26.                     [name] => DVD
    27.                      [] => Array
    28.                     (
    29.                         [name] => blueray
    30.                         [name] => cd
    31.                         [name] => dvd
    32.                     )
    33.                 )
    34.  
    35.         )
    36.  
    37. )
     
  4. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    ну пжл подскажите как рекурсивно построить массив :(
     
  5. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    up
    ну люди, вы же профи, подскажите как правильно заполнить рекурсивно массив
    у меня 2-а шага выходит потом, нужно передавать путь, что б при дальнейшем рекурсивном добавлении в массив оно знало куда добавить значение. но я не могу сообразить как, ХЕЛП!!!!!!!!!!!!!!!!!!!!
     
  6. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    наконец то...

    может кому понадобится

    Решение:

    PHP:
    1.  
    2. <?php
    3. set_error_handler("Handler");
    4. function Handler($errno,$errstr,$errfile,$errline){
    5.     if(error_reporting()){
    6.         $errors=array(
    7.               E_ERROR              => 'Error',
    8.               E_WARNING            => 'Warning',
    9.               E_PARSE              => 'Parsing Error',
    10.               E_CORE_ERROR        => 'Core Error',
    11.               E_CORE_WARNING      => 'Core Warning',
    12.               E_COMPILE_ERROR      => 'Compile Error',
    13.               E_COMPILE_WARNING    => 'Compile Warning',
    14.               E_USER_ERROR        => 'User Error',
    15.               E_USER_WARNING      => 'User Warning',);
    16.         if(array_key_exists($errno,$errors)){
    17.             die("<b>Тип:</b> ".$errors[$errno]."\r\n<br><b>Текст:</b> {$errstr}\r\n<br><b>Файл:</b> {$errfile}\r\n<br><b>Строка:</b> {$errline}");
    18.         }
    19.     }
    20. }
    21.  
    22.  
    23. function utf8encode($str,$encode="WINDOWS-1251")
    24. {
    25.     return iconv($encode,'UTF-8',$str);
    26. }
    27.  
    28. function utf8decode($str,$encode="WINDOWS-1251")
    29. {
    30.     return iconv('UTF-8',$encode,$str);
    31. }
    32.  
    33. function dump($arr,$mode=false,$stop=false)
    34. {  
    35.     echo "<pre>";
    36.     (!$mode) ? print_r($arr) : var_dump($arr);
    37.     echo "</pre>";
    38.     $stop ? exit() : "";
    39. }
    40.  
    41.  
    42. $arr_category = array("catalog" => array("category/@id" => 1,
    43.                                          "category/@parentID" => 2,
    44.                                          "category" => 3));    
    45.  
    46. $i=0;
    47. $xml = simplexml_load_file('test2.xml');
    48.  
    49. foreach($arr_category as $key => $item){
    50.     foreach($item as $name => $col){
    51.         $query[$i] .= '//'.$key.'/'.$name;
    52.         $i++;
    53.     }
    54. }
    55.  
    56.  
    57. //dump($query);
    58. // Сделано только для того XML - который обозначает корни без parentID
    59. $query_cat = "//catalog/category[not(@parentID)]";
    60.  
    61. $arr=$xml->xpath($query_cat);
    62.  
    63. if(!empty($arr)){
    64.  
    65.      
    66. function recurseTree (&$tree, $arr, $xml) {
    67.    
    68.     function recurseArr (&$tree, $xml, $netxid, $i) {
    69.          
    70.             //echo $i;
    71.             $arr = $xml->xpath("//catalog/category[@parentID='".trim($netxid)."']");
    72.             //dump($arr);
    73.            
    74.             foreach ($arr as $j => $key1) {
    75.                 //dump($key1);
    76.                 $atr = $key1->attributes();
    77.                 //dump($atr);
    78.                 $id = $atr['id'];
    79.                 $parentid = $atr['parentid'];
    80.                
    81.                 //echo $k." - ".$v." - ".$tree [$i]['id']."<br>";
    82.                
    83.                
    84.                 if(count($arr)>1){
    85.                      
    86.                     $tree [$i] ['str']['name'][(int)$id] = utf8decode("$key1");
    87.                 } else {
    88.                     $tree[$i]['sub']['id'] = (int)$id;
    89.                     $tree [$i] ['sub']['name'] = utf8decode("$key1");
    90.                 }
    91.                
    92.                 //unset($arr [$j] );
    93.                 // dump($tree);
    94.                 recurseArr ($tree [$i] ['sub'], $xml,$id,$j);
    95.                  
    96.                 }  
    97.             return false;
    98.         }
    99.  
    100.     for ($i=0; $i< count($arr); $i++) {
    101.        
    102.         $tree[$i]['id'] = (string)$arr[$i]->attributes();
    103.         $tree[$i]['name'] = utf8decode("$arr[$i]");
    104.         recurseArr ($tree, $xml, $tree[$i]['id'],$i);  
    105.        
    106.     }
    107.     //dump($tree);
    108.    
    109. }
    110. $tree = array();
    111. recurseTree ($tree, $arr, $xml);
    112. dump($tree);
    113.  
    114.    
    115.      
    116. } else {
    117.     /* ... */
    118. }
    119.  
    120. ?>
    121.  
    122.