Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Tree-Rangliste...oberster Knoten merkt sich Werte nicht [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Tree-Rangliste...oberster Knoten merkt sich Werte nicht


 
Phrozen
06-03-2006, 21:55 
 
Es geht um ein Modul, dass ich gerade programmiere.

Ich benutze PHP Version 4.4.2

ich versuche einen tree aufzubauen.

hier die klasse

wird folgendermassen instanziert:

$irgendwas = new leaguePosition([z.b. 4], null)


class leaguePosition{
//referenz auf vorherige leaguePositionen
var $childleaguePosition = null;
//referenz auf parent
var $parentleaguePosition = null;
//actual Team
var $teamOnPos = null;
//derzeit größter vergebene rang
var $maxSetPlace = 0;

function leaguePosition($depth, $parentPos){
$this->parentleaguePosition = $parentPos;
if($depth>1){
$this->childleaguePositions[0] = new leaguePosition($depth-1,$this);
$this->childleaguePositions[1] = new leaguePosition($depth-1,$this);
}
elseif ($depth==1){
echo $this->getMaxSetPlace();
}
}

function getMaxSetPlace(){
if($this->parentleaguePosition == null){
$this->maxSetPlace++;
return $this->maxSetPlace;
}
else {
return $this->parentleaguePosition->getMaxSetPlace();
}
}
}


das problem. JEDE der untersten childobj. sollen einen wert aus der dem obersten parentobj. bekommen.

der tree wird rekursiv aufgebaut und um den wert zu erhalten wird solange die parent knoten durchsucht bist der oberste erreicht ist.

jedoch gibt er mir immer nur 11111111 aus?!?!?!?

ich versteh einfach nicht wieso der oberste knoten sich den wert nicht merkt.

thx für hilfe =D

 
penizillin
06-03-2006, 22:04 
 
und du erwartest was? 10000000?

 
Phrozen
06-03-2006, 22:09 
 
ich will im grunde einen zähler für die untersten knoten


ich erwarte mir in meinem fall wenn einen tree mit einer tiefe von 4 wobei jeder knoten 2 childs hat:

echo "12345678"

da ich 8 basisknoten habe

ich dachte es wär das einfachste eine variable im obersten zu haben von der jeder basisknoten den wert erhalten kann.

 
penizillin
06-03-2006, 22:10 
 
warum speicherst du diese id nicht als eigenschaft einer jeden instanz?

 
Phrozen
06-03-2006, 22:14 
 
das hatte ich auch in weiterer folge vor :)

aber wie soll ich denn eine id speichern wenn mein fortlaufender zähler sich den wert nicht speichert :confused:

 
Luke
06-03-2006, 22:16 
 
So betrunken wie ich grad bin...

Kann es sein dass er maxSetPlace nur erhöht wenn kein parent vorhanden ist, also höchstens 1 mal, beim 1sten Knoten? Müsste das nicht umgekehrt lauten? if($this->parentleaguePosition != null)


edit: erhöht der den wert überhaupt? Wo übergibt der denn den erhöhten wert?

 
penizillin
06-03-2006, 22:19 
 
nein, wenn, dann soll der wert bei der rekursion erhöht werden. return $this->parentleaguePosition->getMaxSetPlace() + 1; aber ich denke, man kann es sinnvoller verwenden, wenn man die id zu jeder instanz speichert. und im konstruktor soetwas wie $this->id = $parentPos->id + 1; einbaut.

 
Phrozen
06-03-2006, 22:31 
 
luke: na dann prost =)

erhöht wird der wert bei $this->maxSetPlace++;

es soll auch nur erhöht werden wenn keiner vorhanden ist. in meinem bsp ist er der top knoten. vondem aus jeder unterste child knoten einen wert erhält und den im top knoten erhöt.

penizillin:

class leaguePosition{
//referenz auf vorherige leaguePositionen
var $childleaguePosition = null;
//referenz auf parent
var $parentleaguePosition = null;
//actual Team
var $teamOnPos = null;
//derzeit größter vergebene rang
var $maxSetPlace = 0;
//id
var $id = null;

function leaguePosition($depth, $parentPos){
$this->parentleaguePosition = $parentPos;
if($depth>1){
$this->childleaguePositions[0] = new leaguePosition($depth-1,$this);
$this->childleaguePositions[1] = new leaguePosition($depth-1,$this);
}
elseif ($depth==1){
$id = $this->getMaxSetPlace();
echo $id;
}
}

function getMaxSetPlace(){
if($this->parentleaguePosition == null){
$this->maxSetPlace++;
return $this->maxSetPlace;
}
else {
return $this->parentleaguePosition->getMaxSetPlace();
}
}
}


Da ich nur für die untersten knoten eine id benötige sollte der tree ca so ausschauen
oberster knoten
3 3
2 2 2 2
1 1 1 1 1 1 1 1
ids 1 2 3 4 5 6 7 8


und der zähler, so habe ich mir das halt vorgestellt, läuft im obersten knoten ab.

 
penizillin
06-03-2006, 22:36 
 
erhöht wird der wert bei $this->maxSetPlace++; nur ein mal, und das für den root - deswegen bliebs bei 111111111.

wenn du aber eine eigenschaft "id" implementierst, so kümmere dich darum, dass sie im konstruktor für alle gesetzt wird, von der des parents ausgehend.

 
Alrik
06-03-2006, 22:43 
 
Hi,

Ich habe deine Klasse oben genommen und erhalte bei 4: 12345678
Das ist doch das was du wolltest?
Oder seh ich da was falsch?

Gruß Thomas

€: Ich seh grad du hast geeditet ;)

 
Phrozen
06-03-2006, 22:48 
 
na das finde ich aber klasse...

warum auch immer es bei dir funktioniert...

welche php vers. hast du?
apche?
php.ini einstellungen?


*ratlos sei*

 
Alrik
06-03-2006, 22:52 
 
Hast du das oben nicht umgeändert?

Apache/2.0.54 (Win32) mod_ssl/2.0.54 OpenSSL/0.9.7g PHP/5.0.4

An der ini hab ich nichts verändert, außer die register_globals = off.

 
Phrozen
06-03-2006, 22:56 
 
kann das tatächlich PHP 5 sein, was bei mir den fehler hervorruft?!?!?!?

 
Phrozen
06-03-2006, 23:06 
 
problem solved:

Lösung: Umstieg von PHP 4 aufs 5er.

=/


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:15 Uhr.