[PHP] Hierarchie backtrace in array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Hoi,

Ik heb echt een probleem van kleuterklas- / zandbakniveau maar ik kom er maar niet uit. Ik probeer een functie te maken die mijn debug-logs in een hierarchische structuur plaatst aan de hand van de debug_backtrace().

Een debuglog is een array die een message bevat, een timestamp, een type en een status. De arrays die debug_backtrace genereert zien er (versimpeld) bijv zo uit:

code:
1
2
3
4
5
6
[0] - [file]=>"debugger.php"
     - [line]=>"10"
[1] - [file]=>"docbuilder_html.php"
       [line]=>"15"
[2] - [file]=>"index.php"
       [line]=>"5"


De volgorde is feitelijk omgekeerd: Het bestand die het 'diepst' in de hierarchy moet komen staat als eerste genoemd. Ik wil dit gaan herschrijven tot een array die ik maar even 'debugstructure' heb genoemd. Deze array moet alle debuglogs gaan bevatten en hierarchisch structureren. In het genoemde voorbeeld:

code:
1
$this->debugstructure[index.php][5][docbuilder_html.php][15][debugger.php][10] = $debuglog;


De functie die ik heb gemaakt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
private function parse_log($text, $result, $type, $timestamp, $backtrace) {

    #init
    $temp = array("text"=>$text, "result"=>$result, "type"=>$type, "timestamp"=>$timestamp);
    foreach ( $backtrace as $vbt ) { $struct[] = array("file"=>$vbt['file'], "line"=>$vbt['line']); }

    #build structure
    foreach ( $struct as $vs ) { $temp = array($vs['file']=>array($vs['line']=>$temp)); }
    foreach ( $temp as $kt=>$vt ) { $this->debugstructure[$kt] = $vt; }

}


Ik vind em nog niet helemaal sexy, maar hij werkt gedeeltelijk: De hierarchie wordt correct opgebouwd. Probleem is alleen dat bij het schrijven naar debugstructure alle vorige info van file $kt wordt overschreven. Ik voel aan mn water dat ik hier een recursieve functie moet gaan gebruiken, maar hoe?

Even simpeler: Ik probeer dus een functie te maken waar je een array instopt, die die array als het ware 'optelt' bij een bestaande array, zonder dat er info van de bestaande array verloren gaat.

[ Voor 5% gewijzigd door xilent_xage op 09-03-2009 09:29 . Reden: even simpeler ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
array_merge() en array_reverse() bedoel je :?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Zo snel als je kunt die als map gebruikte arrays overboord gooien. Het is wel de meest ranzige troep die ik altijd zie in php. Gebruik de mogelijkheden van je taal. Maak gewoon mooie popo's.

Je maakt gewoon een TraceLine class met daarin als property een file en een linenumber. Vervolgens maak je een class Trace met daarin wel weer een array, maar allemaal van TraceLine objecten.

Voor je logging gebruik je vervolgens een leuk LogItem object met als properties een Trace en een message. Voor de leukigheid kun je hierin nog wat meuk implementeren die het leuk wegschrijft.

Maar asjeblieft, blijf zo ver mogelijk weg van in elkaar gehackte en compleet onwerkbaar en onleesbaar wordende en tot in het oneindige geneste array objecten.....

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'