php rekursiv funktion behöver hjälp

Permalänk
Medlem

php rekursiv funktion behöver hjälp

hej behöver hjälp!

Har en trädstruktur i en db

varje nod pekar på sin förälder top noden pekar på null.

det jag vill göra är att ange en nod och hitta alla dess barn nedåt i strukturen.

Suttit ett tag nu och funderat, varför kommer inte nod 84 med i resultat arrayen?
Någon snäll själ som kan visa mig vägen!?

utdrag ur db trädtabell

id parent_id name 59 10 3 58 Team Luleå 82 10 4 59 tester 83 10 4 59 tester2 84 10 5 82 tester 3

foreach ($ug->GetSiteMappingArray() as $mapping){ array_push($objUserSiteMaps,$mapping); _p( "(" . $mapping->Id . ")" . $mapping->Name); echo "<br>"; $arrNodes = getChildMapIds($mapping->Id,array($mapping->Id)); print_r ($arrNodes); echo "<br>"; }

function getChildMapIds($mapId,$value = array()){ //söker i trädet och returnerar en array av alla noder vars förälder är $mapId $objSiteMapChildren = SiteMapping::QueryArray(QQ::AndCondition(qq::Equal(QQN::SiteMapping()->ParentId,$mapId))); foreach($objSiteMapChildren as $child){ echo "found child for [".$mapId."]->child[".$child->Id."]<br>"; echo "adding child[".$child->Id."] to array<br>"; array_push($value,$child->Id); //if(!empty($objSiteMapChildren)){ getChildMapIds($child->Id,$value); //} } return $value; }

output

USERGROUP id:1 :AF - Luleå (59)Team Luleå found child for [59]->child[82] adding child[82] to array found child for [82]->child[84] <- här hittas 84 adding child[84] to array found child for [59]->child[83] adding child[83] to array Array ( [0] => 59 [1] => 82 [2] => 83 ) <-WTF? varför kommer inte 84 med? USERGROUP id:2 :AF - Umeå (60)Team Umeå Array ( [0] => 60 ) USERGROUP id:3 :AF - Östersund (61)Team Östersund Array ( [0] => 61 ) USERGROUP id:4 :AF - Falun (62)Team Falun Array ( [0] => 62 ) USERGROUP id:5 :AF - Karlstad (63)Team Karlstad Array ( [0] => 63 ) USERGROUP id:6 :AF - Stockholm (64)Team Stockholm Array ( [0] => 64 ) USERGROUP id:7 :AF - Göteborg (65)Team Göteborg Array ( [0] => 65 ) USERGROUP id:8 :AF - Växjö (66)Team Växjö Array ( [0] => 66 ) USERGROUP id:9 :AF - Malmö (67)Team Malmö Array ( [0] => 67 )

Permalänk
Medlem
Skrivet av hellhell:

hej behöver hjälp!

Har en trädstruktur i en db

varje nod pekar på sin förälder top noden pekar på null.

det jag vill göra är att ange en nod och hitta alla dess barn nedåt i strukturen.

Suttit ett tag nu och funderat, varför kommer inte nod 84 med i resultat arrayen?
Någon snäll själ som kan visa mig vägen!?

utdrag ur db trädtabell

id parent_id name 59 10 3 58 Team Luleå 82 10 4 59 tester 83 10 4 59 tester2 84 10 5 82 tester 3

foreach ($ug->GetSiteMappingArray() as $mapping){ array_push($objUserSiteMaps,$mapping); _p( "(" . $mapping->Id . ")" . $mapping->Name); echo "<br>"; $arrNodes = getChildMapIds($mapping->Id,array($mapping->Id)); print_r ($arrNodes); echo "<br>"; }

function getChildMapIds($mapId,$value = array()){ //söker i trädet och returnerar en array av alla noder vars förälder är $mapId $objSiteMapChildren = SiteMapping::QueryArray(QQ::AndCondition(qq::Equal(QQN::SiteMapping()->ParentId,$mapId))); foreach($objSiteMapChildren as $child){ echo "found child for [".$mapId."]->child[".$child->Id."]<br>"; echo "adding child[".$child->Id."] to array<br>"; array_push($value,$child->Id); //if(!empty($objSiteMapChildren)){ getChildMapIds($child->Id,$value); //} } return $value; }

output

USERGROUP id:1 :AF - Luleå (59)Team Luleå found child for [59]->child[82] adding child[82] to array found child for [82]->child[84] <- här hittas 84 adding child[84] to array found child for [59]->child[83] adding child[83] to array Array ( [0] => 59 [1] => 82 [2] => 83 ) <-WTF? varför kommer inte 84 med? USERGROUP id:2 :AF - Umeå (60)Team Umeå Array ( [0] => 60 ) USERGROUP id:3 :AF - Östersund (61)Team Östersund Array ( [0] => 61 ) USERGROUP id:4 :AF - Falun (62)Team Falun Array ( [0] => 62 ) USERGROUP id:5 :AF - Karlstad (63)Team Karlstad Array ( [0] => 63 ) USERGROUP id:6 :AF - Stockholm (64)Team Stockholm Array ( [0] => 64 ) USERGROUP id:7 :AF - Göteborg (65)Team Göteborg Array ( [0] => 65 ) USERGROUP id:8 :AF - Växjö (66)Team Växjö Array ( [0] => 66 ) USERGROUP id:9 :AF - Malmö (67)Team Malmö Array ( [0] => 67 )

Jag tror att det är ett referensproblem.
Varje gång du skickar in en array i metoden så görs det en kopia av arrayen.

Här är ett exempel på problemet:

http://phpfiddle.org/main/code/wh2-q7n

Lösningen borde vara att sätta argumentet "$value = array()" till "&$value = array()" eller "&$value" om du ändå alltid kommer in med en array.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

helt korrekt Leedow, hade precis fått det att fungera med ref fast inte i functions declareringen

jag satte byref inne i det rekursiva anropet är det fel?

function getChildMapIds($mapId,$value = array()){ //istället ange här &$value som du föreslog $objSiteMapChildren = SiteMapping::QueryArray(QQ::AndCondition(qq::Equal(QQN::SiteMapping()->ParentId,$mapId))); foreach($objSiteMapChildren as $child){ echo "found child for [".$mapId."]->child[".$child->Id."]<br>"; //array_push($arrayNodes,$child->Id); echo "adding child[".$child->Id."] to array<br>"; array_push($value,$child->Id); getChildMapIds($child->Id,&$value); // är det fel? fast jag får rätt returvärden nu } return $value; }

Permalänk
Medlem
Skrivet av hellhell:

helt korrekt Leedow, hade precis fått det att fungera med ref fast inte i functions declareringen

jag satte byref inne i det rekursiva anropet är det fel?

function getChildMapIds($mapId,$value = array()){ //istället ange här &$value som du föreslog $objSiteMapChildren = SiteMapping::QueryArray(QQ::AndCondition(qq::Equal(QQN::SiteMapping()->ParentId,$mapId))); foreach($objSiteMapChildren as $child){ echo "found child for [".$mapId."]->child[".$child->Id."]<br>"; //array_push($arrayNodes,$child->Id); echo "adding child[".$child->Id."] to array<br>"; array_push($value,$child->Id); getChildMapIds($child->Id,&$value); // är det fel? fast jag får rätt returvärden nu } return $value; }

För att kolla upp vad som är mest korrekt får man nog grotta ner sig i någon bok som diskuterar det där närmare.
Personligen hade jag nog satt det på argumentet. Främst för att man då enkelt ser att man inte får en ny array utan den påverkar den befintliga. Det blir lite svårare att se om man måste titta vidare i koden för att se att det sker.
Om du får rätt värden och är nöjd så är det bara att köra vidare.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?