| 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: 6 let
|
|||
0