Funzione Ricorsiva e creazione array personalizzato

Salve Gianni,

come va? Ho una missione impossibile da compiere: Funzione Ricorsiva.

Si lo so che non è una buona soluzione ma risolve il mio problema.

Ecco il problema:

REALIZZARE UNA FUNZIONE RICORSIVA CHE MI CREA UN ARRAY PERSONALIZZATO.

RIPORTO SOTTO LA TABELLA DEL DB.

L'INTENTO E' CREARE UNA FUNZIONE RICORSIVA CHE NON EFFETTUI DECINE DI QUERY MA SCORRI UN ARRAY CREATO DA UNA SOLA QUERY CHE RECUPERA TUTTI I DATI.

mysql> select * from product_categories;
+------------+------------------------+-------------+-----------+--------+-------+
| idcategory | category_name          | description | parent_id | active | photo |
+------------+------------------------+-------------+-----------+--------+-------+
|          1 | Abbigliamento          | NULL        |         0 |      1 | NULL  |
|          2 | Casa e Cucina          | NULL        |         0 |      1 | NULL  |
|          3 | Salute e Bellezza      | NULL        |         0 |      1 | NULL  |
|          4 | Film e Musica          | NULL        |         0 |      1 | NULL  |
|          5 | Donna                  | NULL        |         1 |      1 | NULL  |
|          6 | Uomo                   | NULL        |         1 |      1 | NULL  |
|          7 | Bambino                | NULL        |         1 |      1 | NULL  |
|          8 | Maglie                 | NULL        |         5 |      1 | NULL  |
|          9 | Pantaloni              | NULL        |         5 |      1 | NULL  |
|         10 | Pullover               | NULL        |         5 |      1 | NULL  |
|         11 | Camicie                | NULL        |         5 |      1 | NULL  |
|         12 | Gonne                  | NULL        |         5 |      1 | NULL  |
|         13 | Abiti e Tallieur       | NULL        |         5 |      1 | NULL  |
|         14 | Pigiami                | NULL        |         5 |      1 | NULL  |
|         15 | Intimo                 | NULL        |         5 |      1 | NULL  |
|         16 | Abbigliamento Sportivo | NULL        |         5 |      1 | NULL  |
|         17 | Scarpe                 | NULL        |         5 |      1 | NULL  |
|         18 | Accessori              | NULL        |         5 |      1 | NULL  |
+------------+------------------------+-------------+-----------+--------+-------+
18 rows in set (0.00 sec)

ARRAY DA CREARE:

############################################################

Array
(
    [0] => Array
        (
            [text] => Elettrodomestici
            [link] => index.php?q=1
            [class] => topnav
        )

    [1] => Array
        (
            [text] => Arredamento
            [link] => index.php?q=2
            [class] => topnav
        )

    [2] => Array
        (
            [text] => Computer
            [link] => index.php?q=3
            [class] => topnav
            [submenu] => Array
                (
                    [0] => Array
                        (
                            [text] => Notebook
                            [link] => index.php?q=4
                            [class] => subnav
                        )

                    [1] => Array
                        (
                            [text] => Desktop
                            [link] => index.php?1
                            [class] => subnav
                            [submenu] => Array
                                (
                                    [0] => Array
                                        (
                                            [text] => Notebook
                                            [link] => index.php?q=4
                                            [class] => subnav
                                        )

                                    [1] => Array
                                        (
                                            [text] => Desktop
                                            [link] => index.php?1
                                            [class] => subnav
                                            [submenu] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [text] => Notebook
                                                            [link] => index.php?q=4
                                                            [class] => subnav
                                                        )

                                                    [1] => Array
                                                        (
                                                            [text] => Desktop
                                                            [link] => index.php?1
                                                            [class] => subnav
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

ARRAY RECUPERARE:

############################################################

Array
(
    [0] => Array
        (
            [idcategory] => 1
            [category_name] => Abbigliamento
            [description] => 
            [parent_id] => 0
            [active] => 1
            [photo] => 
        )

    [1] => Array
        (
            [idcategory] => 2
            [category_name] => Casa e Cucina
            [description] => 
            [parent_id] => 0
            [active] => 1
            [photo] => 
        )

    [2] => Array
        (
            [idcategory] => 3
            [category_name] => Salute e Bellezza
            [description] => 
            [parent_id] => 0
            [active] => 1
            [photo] => 
        )

    [3] => Array
        (
            [idcategory] => 4
            [category_name] => Film e Musica
            [description] => 
            [parent_id] => 0
            [active] => 1
            [photo] => 
        )

    [4] => Array
        (
            [idcategory] => 5
            [category_name] => Donna
            [description] => 
            [parent_id] => 1
            [active] => 1
            [photo] => 
        )

    [5] => Array
        (
            [idcategory] => 6
            [category_name] => Uomo
            [description] => 
            [parent_id] => 1
            [active] => 1
            [photo] => 
        )

    [6] => Array
        (
            [idcategory] => 7
            [category_name] => Bambino
            [description] => 
            [parent_id] => 1
            [active] => 1
            [photo] => 
        )

    [7] => Array
        (
            [idcategory] => 8
            [category_name] => Maglie
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

    [8] => Array
        (
            [idcategory] => 9
            [category_name] => Pantaloni
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

    [9] => Array
        (
            [idcategory] => 10
            [category_name] => Pullover
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

    [10] => Array
        (
            [idcategory] => 11
            [category_name] => Camicie
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

    [11] => Array
        (
            [idcategory] => 12
            [category_name] => Gonne
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

    [12] => Array
        (
            [idcategory] => 13
            [category_name] => Abiti e Tallieur
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

    [13] => Array
        (
            [idcategory] => 14
            [category_name] => Pigiami
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

    [14] => Array
        (
            [idcategory] => 15
            [category_name] => Intimo
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

    [15] => Array
        (
            [idcategory] => 16
            [category_name] => Abbigliamento Sportivo
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

    [16] => Array
        (
            [idcategory] => 17
            [category_name] => Scarpe
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

    [17] => Array
        (
            [idcategory] => 18
            [category_name] => Accessori
            [description] => 
            [parent_id] => 5
            [active] => 1
            [photo] => 
        )

)

Spero tu possa aiutarmi ma non riesco a creare questa funzione.

Ecco il mio tentativo disperato:

   private function CreateMenu($items, $parent_id = 0) {
      
      for($i = $j; $i < count($items); $i ++) {
         if ($items[$i]['parent_id'] > 0) {
            $tmp_items = GetItems($items, $parent_id);
            CreateMenu($items, $items[$i]['parent_id']);
         }else {
            echo $items[$i]['category_name'] . "<br>";
         }
      }
   }
   
   private function GetItems($items, $parent_id){
      $tmp_array = array();
      for($i = 0; $i < count($items); $i++) {
         if ($items[$i]['parent_id'] == $parent_id) {
            $tmp_array[] = $items[$i];
         }
      }
      return $tmp_array;
   }
inviato 7 anni fa
ulisse
X 0 X

Problema risolto:

La seguente classe utilizza Smarty ed il plugin SmartyMenu (http://www.phpinsider.com/php/code/SmartyMenu/). Recuperando i record come da post precedente è possibile ricreare un array personalizzato per creare un menù come il seguente: http://www.phpinsider.com/php/code/SmartyMenu/demo/index.php?style=outline_h

<?php

class mod_menu extends Models {
   protected $hiercategories;
   
   public function __construct() {
   }
   
   public function __destruct() {
   }
   
   private function CreateMenu($items, $parent_id = 0) {
      $tmp_arr = array();
      $tmp_items = $this->GetItems($items, $parent_id);
      for($i = 0; $i < count($tmp_items); $i ++) {
         $children = $this->CreateMenu($items, $tmp_items[$i]['idcategory']);
         $tmp_arr[] = array(
                  'id'=> $tmp_items[$i]['idcategory'], 
                  'text' => $tmp_items[$i]['category_name'], 
                  'link' => '', 
                  'class' => '', 
                  'submenu' => $children
         );
      }
      return $tmp_arr;
   }
   
   private function GetItems($items, $parent_id) {
      $tmp_array = array();
      for($i = 0; $i < count($items); $i ++) {
         if ($items[$i]['parent_id'] == $parent_id) {
            $tmp_array[] = $items[$i];
         }
      }
      return $tmp_array;
   }   
   
   public function Output() {
      $libs = singleton::getInstance('Library');
      $categs = singleton::getInstance('Product_Category');
      $tpl = $libs->retrieveTemplate('models/mod_menu/templates/');
      
      $theCategs = $categs->Load("*");
      $menu = $this->CreateMenu($theCategs);
      $tpl->assign('menu', $menu);
      return $tpl->fetch('mod_menu.htpl');
   }

}

?>
risposto 7 anni fa
ulisse
modificato 7 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda