Autor Zpráva
Adam1999
Profil
Ahoj všem,
Mám dvě pole, které vypadají takto:
$category = array();
$category[] = array('name' => "Kategorie 1", "id" => "0", "parent" => array("name" => "Kategorie 2", "id" => "0", "parent" => array("name" => "Kategorie 33", "id" => "0", "parent" => array())));

$categoryFinal = array();
$categoryFinal[] = array('name' => "Kategorie 1", "id" => "70", "parent" => array("name" => "Kategorie 2", "id" => "69", "parent" => array("name" => "Kategorie 3", "id" => "68", "parent" => array())));
$categoryFinal[] = array('name' => "Kategorie 11", "id" => "75", "parent" => array("name" => "Kategorie 2", "id" => "68", "parent" => array("name" => "Kategorie 3", "id" => "67", "parent" => array())));

Pole categoryFinal obsahuje již vytvořené kategorie. Pole category obsahuje nové kategorie. Potřebují category porovnat s categoryFinal podle vnoření tak aby, dokud se vnoření shoduje chci získat id shodné kategorie z categoryFinal. Pokud se již vnoření neshoduje tak provést akci a vytvořit v categoryFinal strom podle kterého se shodovat bude.

Mohu poprosit o nějaký nakopnutí jak aspoň začít?
Díky.
Kajman
Profil
Moc to smysl nedává, stromy se nedefinují od listů. Takže začněte tak, že strom (minimálně v $categoryFinal) se bude postupně větvit přes pole polí nazvané např. children.

Také je divné, že máte pro stejná id (např. 68) dvě různé name.
Adam1999
Profil
Kajman:
Přes pole polí se právě definují v tom poli parent. Ty stejná Id jsou chyba, doopravdy stejná nejsou.
Kajman
Profil
Nedává mi to smysl. V parent máte jen pole s informacemi jednoho rodiče. Zkuste v ukázce zadefinovat níže naznačený strom, ať Vás lépe pochopíme.
Programování
  PHP
    Návody
    Příklady
  JavaSript
    Návody
    Příklady
Adam1999
Profil
Kajman:
Ok upravil jsem tedy strom podle children jak jsi psal.
Nyní vypadá takto:
$category = array();
$category[] = array("name" => "Kategorie 1");
$category[] = array("name" => "Kategorie 21");
$category[] = array("name" => "Kategorie 31");

$categoryFinal = array();
$categoryFinal[] = array("name" => "Kategorie 3", "id" => "10", "level" => "2", "children" => "20");
$categoryFinal[] = array("name" => "Kategorie 2", "id" => "20", "level" => "1", "children" => "30");
$categoryFinal[] = array("name" => "Kategorie 1", "id" => "30", "level" => "0", "children" => "0");

K ověčování a vytvářeních nových kategorií jsem si napsal tento script
$parentId = 0;

foreach ($category as $key => $value) {
    foreach ($categoryFinal as $keyFinal => $valueFinal) {
        if ($value["name"] != $valueFinal["name"] and $key == $valueFinal["level"]) {
            //API vytvoří kategorii a vrátí id
            $categoryFinal[] = array("name" => $value["name"], "id" => rand(50, 90), "level" => $key, "children" => $parentId);
        }

        if ($value["name"] == $valueFinal["name"] and $key == $valueFinal["level"]) {
            $parentId = $valueFinal["id"];
        } 
    }
}

Problém je, že mi nefunguje přiřazování Id k children. Vždy se přiřadí jen první Id a další zůstavá stejný ale přitom by se mělo změnit na poslední kategorii, kterou to vytvořilo při běhu toho foreach.
Kajman
Profil
V postu [#1] se snažíš dělat strom, tam má smysl children.
V postu [#5] máš ale seznam kategorií, tam má smysl naopak původní parent.

Jednoduchá ukázka sestavení stromu a procházení pro nakopnutí. Převést do funkcí/metod a otestovat si to musíte už sám.

// definice seznamu kategorii
$categoryList = array();
$categoryList[0] = array('children'=>array());//root
$categoryList[1] = array("name" => "Programování", "parent" => 0);
$categoryList[2] = array("name" => "PHP",          "parent" => 1);
$categoryList[3] = array("name" => "Návody",       "parent" => 2);
$categoryList[4] = array("name" => "Příklady",     "parent" => 2);
$categoryList[5] = array("name" => "JavaSript",    "parent" => 1);
$categoryList[6] = array("name" => "Návody",       "parent" => 5);
$categoryList[7] = array("name" => "Příklady",     "parent" => 5);

//seznam kategorii
print_r($categoryList);

//transformace na strom kategorii
foreach($categoryList as $id => $category) {
    $categoryList[$id]['id']=$id;
    if(isset($category['parent']) && isset($categoryList[$category['parent']]))     {
        if(!isset($categoryList[$category['parent']]['children'])) {
            $categoryList[$category['parent']]['children'] = array();
        }
        $categoryList[$category['parent']]['children'][] = &$categoryList[$id];
    }
}

//strom kategorii
print_r($categoryList[0]['children']);

//definice hledane cesty
$newPath = array();
$newPath[] = array("name" => "Programování");
$newPath[] = array("name" => "PHP");
$newPath[] = array("name" => "Diskuse");
$newPath[] = array("name" => "djpw");

//hledani cesty podle name a zanoreni
$parent = 0;
foreach($newPath as $key => $step) {
    if(isset($categoryList[$parent]['children'])) {
        foreach($categoryList[$parent]['children'] as $category) {
            if($step['name']==$category['name']) {
                $newPath[$key]['id']=$category['id'];
                $parent = $category['id'];
                break;
            }
        }
    }
    else {
        $categoryList[$parent]['children'] = array();
    }
    if(!isset($newPath[$key]['id'])) {
        $step['parent']=$parent;
        array_push($categoryList, $step);
        end($categoryList);
        $new_id=key($categoryList);
        $categoryList[$new_id]['id']=$new_id;
        $categoryList[$parent]['children'][] = &$categoryList[$new_id];
        $newPath[$key]['id']=$new_id;
        $parent = $new_id;
    }
}

// cesta s doplnenymi id
print_r($newPath);

// doplneny strom kategorii
print_r($categoryList[0]['children']);
Adam1999
Profil
Kajman:
To je přesně ono. Moc děkuji za pomoc!

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:

0