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 |
#3 · Zasláno: 9. 8. 2019, 09:46:23
Kajman:
Přes pole polí se právě definují v tom poli parent. Ty stejná Id jsou chyba, doopravdy stejná nejsou. |
||
Kajman Profil |
#4 · Zasláno: 9. 8. 2019, 11:02:49
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 |
#5 · Zasláno: 9. 8. 2019, 13:51:31
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 |
#6 · Zasláno: 9. 8. 2019, 16:09:37
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 |
#7 · Zasláno: 9. 8. 2019, 17:03:36
Kajman:
To je přesně ono. Moc děkuji za pomoc! |
||
Časová prodleva: 5 let
|
0