note 70892 added to function.var-dump
| From: | BigueNique at yahoo dot ca | Date: | Fri, 03 Nov 2006 04:33:28 +0000 |
| Subject: | note 70892 added to function.var-dump | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-119328@lists.php.net to get a copy of this message | ||
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
| | }
| }
}
*/
?>
----
Server IP: 66.207.199.35
Probable Submitter: 64.18.188.219
----
Manual Page -- http://www.php.net/manual/en/function.var-dump.php
Edit -- https://master.php.net/note/edit/70892
Del: integrated -- https://master.php.net/note/delete/70892/integrated
Del: useless -- https://master.php.net/note/delete/70892/useless
Del: bad code -- https://master.php.net/note/delete/70892/bad+code
Del: spam -- https://master.php.net/note/delete/70892/spam
Del: non-english -- https://master.php.net/note/delete/70892/non-english
Del: in docs -- https://master.php.net/note/delete/70892/in+docs
Del: other reasons-- https://master.php.net/note/delete/70892
Reject -- https://master.php.net/note/reject/70892
Search -- https://master.php.net/manage/user-notes.php