Geez! That was a hard one!
Wanted a more 'elegant' way do dump variable contents, but soon discovered the 'PHP reference problem', which makes it hard to deal recursive occurence of the same variable.
The only way I found to detect recursion was to actually modify the variable content (passed by reference) in order to be able to know that it was actually parsed.
References in PHP are quite confusing and often PHP got some strange behaviors....
TIP: don't use FOREACH($array as $key->$value) with arrays containing references... You'll get the values the references had at the time they were put in the array, not their actual values. You have to do $value=&$a['key']; (notice the amp) otherwise you're screwed!
Enjoy!
<?php
// An elegant dump
// By BigueNique@yahoo.ca
$elegant_dump_indent = '|  ';
function elegant_dump(&$var, $var_name='', $indent='', $reference='') {
global $elegant_dump_indent;
$reference=$reference.$var_name;
// first check if the variable has already been parsed
$keyvar = 'the_elegant_dump_recursion_protection_scheme';
$keyname = 'referenced_object_name';
if (is_array($var) && isset($var[$keyvar])) {
// the passed variable is already being parsed!
$real_var=&$var[$keyvar];
$real_name=&$var[$keyname];
$type=gettype($real_var);
echo "$indent<b>$var_name</b> (<i>$type</i>) = <font color=\"red\">&$real_name</font><br>".br;
} else {
// we will insert an elegant parser-stopper
$var=array($keyvar=>$var,
$keyname=>$reference);
$avar=&$var[$keyvar];
// do the display
$type=gettype($avar);
// array?
if (is_array($avar)) {
$count=count($avar);
echo "$indent<b>$var_name</b> (<i>$type($count)</i>) {<br>".br;
$keys=array_keys($avar);
foreach($keys as $name) {
$value=&$avar[$name];
elegant_dump($value, "['$name']", $indent.$elegant_dump_indent, $reference);
}
echo "$indent}<br>".br;
} else
// object?
if (is_object($avar)) {
echo "$indent<b>$var_name</b> (<i>$type</i>) {<br>".br;
foreach($avar as $name=>$value) elegant_dump($value, "->$name", $indent.$elegant_dump_indent, $reference);
echo "$indent}<br>".br;
} else
// string?
if (is_string($avar)) echo "$indent<b>$var_name</b> (<i>$type</i>) = \"$avar\"<br>".br;
// any other?
else echo "$indent<b>$var_name</b> (<i>$type</i>) = $avar<br>".br;
$var=$var[$keyvar];
}
}
$a=array();
$b['refers to a']=&$a;
$c['refers to b']=&$b;
$a['refers to c']=&$c;
elegant_dump($a,'$a');
/* Outputs:
$a (array(1)) {
| ['refers to c'] (array(1)) {
| | ['refers to b'] (array(1)) {
| | | ['refers to a'] (array) = &$a <-- stops recursing there
| | }
| }
}
Works with objects too: */
$d->ref2f='';
$e->ref2d=&$d;
$f->ref2e=&$e;
$d->ref2f=&$f;
elegant_dump($d,'$d');
/* Outputs:
$d (object) {
| ->ref2f (object) {
| | ->ref2e (object) {
| | | ->ref2d (object) = &$d
| | }
| }
}
*/
?>