Autor Zpráva
robb
Profil *
Mam takovy programatorsky orisek.
Mam dvourozmerne pole (nactene z db, ale na to, nesejde) nasledujiciho tvaru. Muze jit napr. o kategorie v eshopu.
Př:
(array) Array
(
    [1] => Array
          (
            [id] => 1
            [name] => Kategorie 1
            [parent_id] => 0
          )
    [2] => Array
          (
            [id] => 2
            [name] => Podkategorie 1
            [parent_id] => 1
          )
    [3] => Array
          (
            [id] => 3
            [name] => Podkategorie 2
            [parent_id] => 1
          )
    [4] => Array
          (
            [id] => 4
            [name] => Podpodkategorie 1
            [parent_id] => 2
          )
    ...
)


parent_id: odkazuje na kategorii, ktera je rodicem dane kategorie. Nula znamena korenovou kategorii, bez rodice.

Strom tedy vypada asi takto:
Kategorie 1
---Podkategorie 1
------Podpodkategorie 1
---Podkategorie 2
atd.

Jde mi o to, pretvorit jej na n-rozmerne pole, kde pole s kategorii bude obsahovat novy prvek napr. pod klicem subcategories a v nem sve podkategorie:

(array) Array
(
  [1] => Array
  (
    [id] => 1
    [name] => Kategorie 1
    [parent_id] => 0
    [subcategories] => Array
     (
       [2] => Array
       (
         [id] => 2
         [name] => Podkategorie 1
         [parent_id] => 1
         [subcategories] => Array
        (
          [4] => Array
          (
            [id] => 4
            [name] => Podpodkategorie 1
            [parent_id] => 2
            [subcategories] => Array()
          )
        )
      )
      [3] => Array
      (
        [id] => 3
        [name] => Podkategorie 2
        [parent_id] => 1
        [subcategories] => Array()
      )
    )
  )
)


Tzn, ze jiz ze struktury pole bude jasne kdo je komu rodicem a potomkem.
Polozek a urovni vnoreni muze byt nekonecno.

Pokud nekdo vi jak toto vyresit, budu rad za nakopnuti. Diky
Mike8748_
Profil *
neni to presne doslova co bys chtel ale rozdil je minimalni

$pole=array(... tvoje pole z DB ...);
$vystup=array();
foreach ($pole as $polozka)
{
  if (!array_key_exists($polozka['id'],$vystup) { $vystup[$polozka['id']]['subcat']=array();
  $vystup[$polozka['id']]['polozka']=$polozka;
  $vystup[$polozka['parent_id']['subcat'][$polozka['id']]=&$vystup[$polozka['id']];
 }
 
 var_dump($vystup[0]);

dostanes pole kde kazdej prvek bude obsahovat array('polozka'=>..informace o polozce..,'subcat'=>..pole potomku..)
PS:psano z hlavy ale melo by to byt dobre
Mike8748_
Profil *
oprava 7 radku
$vystup[$polozka['parent_id']]['subcat'][$polozka['id']]=&$vystup[$polozka['id']];
robb
Profil *
Diky, za zajimave reseni, ale porad to neni ono. Nicmene me to zahadnym zpusobem trklo a vymyslel jsem toto:
Vytvorim si funkci:
function menu($pole, $parent_id)
  {
    $vystup = false;
    foreach($pole as $polozka)
    {
      if($polozka['parent_id'] == $parent_id)
      {
        $vystup[$polozka['id']] = $polozka;
        $vystup[$polozka['id']]['subcategories'] = $this->menu($pole, $polozka['id']);
      }
    }
    return $vystup;
  }


Kterou pak zavolam:
$vysledek = $this->menu($pole, 0);

$pole = moje pole kategorii z db

A dostanu co jsem potřeboval.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: