PHP
downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

serialize> <isset
Last updated: Fri, 02 Jan 2009

view this page in

print_r

(PHP 4, PHP 5)

print_r Prints human-readable information about a variable

Description

mixed print_r ( mixed $expression [, bool $return ] )

print_r() displays information about a variable in a way that's readable by humans.

print_r(), var_dump() and var_export() will also show protected and private properties of objects with PHP 5. Static class members will not be shown.

Remember that print_r() will move the array pointer to the end. Use reset() to bring it back to beginning.

Parameters

expression

The expression to be printed.

return

If you would like to capture the output of print_r(), use the return parameter. If this parameter is set to TRUE, print_r() will return its output, instead of printing it (which it does by default).

Return Values

If given a string, integer or float, the value itself will be printed. If given an array, values will be presented in a format that shows keys and elements. Similar notation is used for objects.

Notes

Note: This function uses internal output buffering with this parameter so it can not be used inside an ob_start() callback function.

Changelog

Version Description
4.3.0 The return parameter was added. If you need to capture the output of print_r() with an older version of PHP prior, use the output-control functions.
4.0.4 Prior to PHP 4.0.4, print_r() will continue forever if given an array or object that contains a direct or indirect reference to itself. An example is print_r($GLOBALS) because $GLOBALS is itself a global variable that contains a reference to itself.

Examples

Example #1 print_r() example

<pre>
<?php
$a 
= array ('a' => 'apple''b' => 'banana''c' => array ('x''y''z'));
print_r ($a);
?>
</pre>

The above example will output:

<pre>
Array
(
    [a] => apple
    [b] => banana
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
        )
)
</pre>

Example #2 return parameter example

<?php
$b 
= array ('m' => 'monkey''foo' => 'bar''x' => array ('x''y''z'));
$results print_r($btrue); // $results now contains output from print_r
?>



serialize> <isset
Last updated: Fri, 02 Jan 2009
 
add a note add a note User Contributed Notes
print_r
afisher8 at cox dot net
17-Dec-2008 04:53
I use this all the time when debugging objects, but when you have a very large object with big arrays of sub-objects, it's easy to get overwhelmed with the large amount of output....sometimes you don't want to see absolutely every sub-object.

I made this function to debug objects while "hiding" sub-objects of certain types.  This also color codes the output for a more readable printout.

<?php

function wtf($var, $arrayOfObjectsToHide=null, $fontSize=11)
{
   
$text = print_r($var, true);

    if (
is_array($arrayOfObjectsToHide)) {
   
        foreach (
$arrayOfObjectsToHide as $objectName) {
   
           
$searchPattern = '#('.$objectName.' Object\n(\s+)\().*?\n\2\)\n#s';
           
$replace = "$1<span style=\"color: #FF9900;\">--&gt; HIDDEN - courtesy of wtf() &lt;--</span>)";
           
$text = preg_replace($searchPattern, $replace, $text);
        }
    }

   
// color code objects
   
$text = preg_replace('#(\w+)(\s+Object\s+\()#s', '<span style="color: #079700;">$1</span>$2', $text);
   
// color code object properties
   
$text = preg_replace('#\[(\w+)\:(public|private|protected)\]#', '[<span style="color: #000099;">$1</span>:<span style="color: #009999;">$2</span>]', $text);
   
    echo
'<pre style="font-size: '.$fontSize.'px; line-height: '.$fontSize.'px;">'.$text.'</pre>';
}

// example usage:
wtf($myBigObject, array('NameOfObjectToHide_1', 'NameOfObjectToHide_2'));

?>
vista_ at live dot se
04-Dec-2008 04:31
Do you think it is difficult to see what print_r() returns?

<?php
  
echo '<pre>';
  
print_r($array);
   echo
'</pre>';
?>

And if you have to write this many times in a page, use this:

<?php
  
function preint_r($array)
   {
      echo
'<pre>';
     
print_r($array);
      echo
'</pre>';
   }
?>
everett at myersnetwork dot com
23-Nov-2008 11:02
I like the print_r() function as I am sure many of you do, however when I am working on a script via a browser the output it not easy to read so I have created my own variation hope this helps any of you guys who have had the same frustration.

Start File ###########################################
<?php
/*
File Name: print_ar.php
PHP: 5.2.3
*/

function print_ar($array, $count=0) {
   
$i=0;
   
$tab ='';
    while(
$i != $count) {
       
$i++;
       
$tab .= "&nbsp;&nbsp;|&nbsp;&nbsp;";
    }
    foreach(
$array as $key=>$value){
        if(
is_array($value)){
            echo
$tab."[<strong><u>$key</u></strong>]<br />";
           
$count++;
           
print_ar($value, $count);
           
$count--;
        }
        else{
           
$tab2 = substr($tab, 0, -12);
            echo
"$tab2~ $key: <strong>$value</strong><br />";
        }
       
$k++;
    }
   
$count--;
}

?>
End File ###########################################

Use is exactly like the print_r() function example;

<?php
require("print_ar.php");

$array = array(
       
"Main1" => array(
               
"Sub1" => "Data 1-1",
               
"Sub2" => "Data 1-2",
               
"Sub3" => "Data 1-3",
        ),

       
"Main2" =>
        array (
               
"Sub1" => "Data 2-1",
               
"Sub2" => "Data 2-2",
               
"Sub3" => "Data 2-3",
        )
);

print_ar($array);
?>

Will give you:
[Main1]
  |~ Sub1: Data 1-1
  |~ Sub2: Data 1-2
  |~ Sub3: Data 1-3
[Main2]
  |~ Sub1: Data 2-1
  |~ Sub2: Data 2-2
  |~ Sub3: Data 2-3

Vice:
Array ( [Main1] => Array ( [Sub1] => Data 1-1 [Sub2] => Data 1-2 [Sub3] => Data 1-3 ) [Main2] => Array ( [Sub1] => Data 2-1 [Sub2] => Data 2-2 [Sub3] => Data 2-3 ) )
kurt krueckeberg
28-Oct-2008 06:53
This is an alternative for printing arrays. It bolds array values.

<?php
function print_array(&$a, $str = "")
{
    if (
$str[0]) {
        echo
"$str =";
    }
    echo
' array( ';
    foreach (
$a as $k => $v) {

        echo
"[$k]".' => ';

        if (
is_array($v)) {
           
print_array($v);
        }
        else {   
               echo
"<strong>$a[$k]</strong> ";
        }
    }
    echo
')  ';
}
$a1 = array ("apples", "oranges", "pears");
$a2 = array ("potatos", "green beans", "squash");
$a3 = array ("euros", "dollars", "pesos", "dinars");
$test = range(1, 9);
array_push($test, array ("fruit" => $a1, "vegies" => $a2, "money" => $a3));
print_array($test, "test");
?>
schizo do not spamme duckie at gmail dot com
07-Oct-2008 12:00
my take on the highlighted markupped debug function:

<?php
/**
 * print_array()
 * Does a var_export of the array and returns it between <pre> tags
 *
 * @param mixed $var any input you can think of
 * @return string HTML
 */
function print_array($var)
{
   
$input =var_export($var,true);
   
$input = preg_replace("! => \n\W+ array \(!Uims", " => Array ( ", $input);
   
$input = preg_replace("!array \(\W+\),!Uims", "Array ( ),", $input);
    return(
"<pre>".str_replace('><?', '>', highlight_string('<'.'?'.$input, true))."</pre>");
}
?>
brenden at beagleproductions dot com
28-Aug-2008 08:58
Many developers have submitted bugs to the PHP development team with regards to print_r showing protected and private properties of objects (PHP 5).  This is not a bug; sensitive information (ex. database connection object) should be  encapsulated within a private member function of your class.
admin at swivelgames dot com
17-Aug-2008 08:44
I was having problems using print_r because I didn't like the fact that if tags where included in the array it would still be parsed by the browsers.

Heres a simple fix for anyone who is having the same problem as I did. This will output your text properly for viewing through the browser instead of the browser's "view source" or CLI.

Script:
<?php

     $MyArray
[0]="<div align='center'>My Text</div>";

     echo
"<pre>".htmlspecialchars(print_r($MyArray,true))."</pre>";

?>

Output:
<pre>Array
(
    [0] =&gt; &lt;div align='center'&gt;My Text&lt;/div&gt;
)
</pre>
mayank dot chaudhary dot 30 at gmail dot com
02-Aug-2008 01:51
I use a function. Since browsers neglect extra spaces and line feeds.
<?php
function print_a($subject){
echo
str_replace("=>","&#8658;",str_replace("Array","<font color=\"red\"><b>Array</b></font>",nl2br(str_replace(" "," &nbsp; ",print_r($subject,true)))));
}
?>
Anonymous
28-Jun-2008 08:21
I have written a nice debugging function.
This function handles arrays beautifully.
<?php
//Debug variables, $i and $k are for recursive use
function DebugDisplayVar($input, $name = "Debug", $i = "0", $k = array("Error")){
    if(
is_array($input))
    {    foreach (
$input as $i => $value){
           
$temp = $k;
           
$temp[] = $i;
           
DebugDisplayVar($value, $name, $i, $temp);}
    }else{
//if not array
       
echo "$".$name;//[$k]
       
foreach ($k as $i => $value){
            if(
$value !=="Error"){echo "[$value]";}
        }
        echo
" = $input<br>";
}    }

//outputs
Debug[0] = value
Debug
[1] = another value
ect
...

?>
janci
13-May-2008 09:49
You cannot use print_r(), var_dump() nor var_export() to get static member variables of a class. However, in PHP5 you can use Reflection classes for this:

<?php

$reflection
= new ReflectionClass('Static');
print_r($reflection->getStaticProperties());

?>
sruwhof at intervisionit dot nl
09-Apr-2008 12:27
@highstrike at gmail dot com 08-Jan-2008 02:34
You have an bug in your debug script, the script only prints public properties of the exported object.

If you want to export all object properties (public, private, protected) to an array, then simply cast the object to an array:

<?php
class some
{
   public
$pub = 1;
   protected
$prot = 2;
   private
$priv = 3;

}
var_dump( (array) new some() );
?>

result:
--------------
array(3) {
  ["pub"]=>
  int(1)
  ["*prot"]=>
  int(2)
  ["somepriv"]=>
  int(3)
}
tylmann at corvent dot ch
28-Mar-2008 10:07
There is a library to create nice output of variables, arrays, hash-tables and even objects. It is great for developing/debugging and looks very much better than any print_r output.

Usage:
<?php
debug
::show($myVar, 'caption');
?>

You can download it for free at http://sourceforge.net/projects/phpcorestdfuncs

For an example take a look at http://demo.corvent.ch/stdfuncs/
helpful at maybe dot com
07-Mar-2008 04:13
Another slight modification to the previous post to allow for empty array elements

added the following lines after the first preg_match block
<?php
       
} else if ($expecting == 2 && preg_match('/^\[(.+?)\] \=\>$/', $trim, $matches)) { // array element
            // the array element is blank
           
list ($fullMatch, $key) = $matches;
           
$topArray[$key] = $element;
        }

?>
anon at anon dot com
29-Feb-2008 06:30
A slight modification to the previous post to allow for arrays containing mutli line strings. haven't fully tested it with everything, but seems to work great for the stuff i've done so far.

<?php

function print_r_reverse(&$output)
{
   
$expecting = 0; // 0=nothing in particular, 1=array open paren '(', 2=array element or close paren ')'
   
$lines = explode("\n", $output);
   
$result = null;
   
$topArray = null;
   
$arrayStack = array();
   
$matches = null;
    while (!empty(
$lines) && $result === null)
    {
       
$line = array_shift($lines);
       
$trim = trim($line);
        if (
$trim == 'Array')
        {
            if (
$expecting == 0)
            {
               
$topArray = array();
               
$expecting = 1;
            }
            else
            {
               
trigger_error("Unknown array.");
            }
        }
        else if (
$expecting == 1 && $trim == '(')
        {
           
$expecting = 2;
        }
        else if (
$expecting == 2 && preg_match('/^\[(.+?)\] \=\> (.+)$/', $trim, $matches)) // array element
       
{
            list (
$fullMatch, $key, $element) = $matches;
            if (
trim($element) == 'Array')
            {
               
$topArray[$key] = array();
               
$newTopArray =& $topArray[$key];
               
$arrayStack[] =& $topArray;
               
$topArray =& $newTopArray;
               
$expecting = 1;
            }
            else
            {
               
$topArray[$key] = $element;
            }
        }
        else if (
$expecting == 2 && $trim == ')') // end current array
       
{
            if (empty(
$arrayStack))
            {
               
$result = $topArray;
            }
            else
// pop into parent array
           
{
               
// safe array pop
               
$keys = array_keys($arrayStack);
               
$lastKey = array_pop($keys);
               
$temp =& $arrayStack[$lastKey];
                unset(
$arrayStack[$lastKey]);
               
$topArray =& $temp;
            }
        }
       
// Added this to allow for multi line strings.
   
else if (!empty($trim) && $expecting == 2)
    {
       
// Expecting close parent or element, but got just a string
       
$topArray[$key] .= "\n".$line;
    }
        else if (!empty(
$trim))
        {
           
$result = $line;
        }
    }
  
   
$output = implode(n, $lines);
    return
$result;
}

/**
 * @param string $output : The output of a multiple print_r calls, separated by newlines
 * @return mixed[] : parseable elements of $output
 */
function print_r_reverse_multiple($output)
{
   
$result = array();
    while ((
$reverse = print_r_reverse($output)) !== NULL)
    {
       
$result[] = $reverse;
    }
    return
$result;
}

$output = '
Array
(
    [a] => apple
    [b] => banana
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
            [3] => Array
            (
                [nest] => yes
                [nest2] => Array
                (
                    [nest] => some more
                    asffjaskkd
                )
                [nest3] => o rly?
            )
        )
)

some extra stuff
'
;
var_dump(print_r_reverse($output), $output);

?>

This should output

array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  array(4) {
    [0]=>
    string(1) "x"
    [1]=>
    string(1) "y"
    [2]=>
    string(1) "z"
    [3]=>
    array(3) {
      ["nest"]=>
      string(3) "yes"
      ["nest2"]=>
      array(1) {
        ["nest"]=>
        string(40) "some more
                    asffjaskkd"
      }
      ["nest3"]=>
      string(6) "o rly?"
    }
  }
}
string(18) "nsome extra stuffn"

Added:
else if (!empty($trim) && $expecting == 2)
{
    // Expecting close parent or element, but got just a string
    $topArray[$key] .= "\n".$line;
}
ario at mail dot utexas dot [education - 3 letters]
19-Feb-2008 08:34
This is a better print_r reverse algorithm, that works with arbitrary nested arrays.  Anything else it treats as strings.  The second function allows you to take a string with multiple print_r results concatenated, and returns the result of parsing each of them.

<?php

/**
 * @param string &$output : The output of a print_r call; this parameter is DESTRUCTIVE, and will be set to the remainder
 *                             of $output which is not parsed.
 * @return mixed : the first parseable element of $output
 */
function print_r_reverse(&$output)
{
   
$expecting = 0; // 0=nothing in particular, 1=array open paren '(', 2=array element or close paren ')'
   
$lines = explode("\n", $output);
   
$result = null;
   
$topArray = null;
   
$arrayStack = array();
   
$matches = null;
    while (!empty(
$lines) && $result === null)
    {
       
$line = array_shift($lines);
       
$trim = trim($line);
        if (
$trim == 'Array')
        {
            if (
$expecting == 0)
            {
               
$topArray = array();
               
$expecting = 1;
            }
            else
            {
               
trigger_error("Unknown array.");
            }
        }
        else if (
$expecting == 1 && $trim == '(')
        {
           
$expecting = 2;
        }
        else if (
$expecting == 2 && preg_match('/^\[(.+?)\] \=\> (.+)$/', $trim, $matches)) // array element
       
{
            list (
$fullMatch, $key, $element) = $matches;
            if (
trim($element) == 'Array')
            {
               
$topArray[$key] = array();
               
$newTopArray =& $topArray[$key];
               
$arrayStack[] =& $topArray;
               
$topArray =& $newTopArray;
               
$expecting = 1;
            }
            else
            {
               
$topArray[$key] = $element;
            }
        }
        else if (
$expecting == 2 && $trim == ')') // end current array
       
{
            if (empty(
$arrayStack))
            {
               
$result = $topArray;
            }
            else
// pop into parent array
           
{
               
// safe array pop
               
$keys = array_keys($arrayStack);
               
$lastKey = array_pop($keys);
               
$temp =& $arrayStack[$lastKey];
                unset(
$arrayStack[$lastKey]);
               
$topArray =& $temp;
            }
        }
        else if (!empty(
$trim))
        {
           
$result = $line;
        }
    }
   
   
$output = implode(n, $lines);
    return
$result;
}

/**
 * @param string $output : The output of a multiple print_r calls, separated by newlines
 * @return mixed[] : parseable elements of $output
 */
function print_r_reverse_multiple($output)
{
   
$result = array();
    while ((
$reverse = print_r_reverse($output)) !== NULL)
    {
       
$result[] = $reverse;
    }
    return
$result;
}

$output = '
Array
(
    [a] => apple
    [b] => banana
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
            [3] => Array
            (
                [nest] => yes
                [nest2] => Array
                (
                    [nest] => some more
                )
                [nest3] => o rly?
            )
        )
)

some extra stuff
'
;
var_dump(print_r_reverse($output), $output);

?>

The above example will output:

array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  array(4) {
    [0]=>
    string(1) "x"
    [1]=>
    string(1) "y"
    [2]=>
    string(1) "z"
    [3]=>
    array(3) {
      ["nest"]=>
      string(3) "yes"
      ["nest2"]=>
      array(1) {
        ["nest"]=>
        string(9) "some more"
      }
      ["nest3"]=>
      string(6) "o rly?"
    }
  }
}
string(20) "
some extra stuff
"
Goose
06-Feb-2008 11:31
A one line command that serves to nl2br but have it so it displays in html is
function nl2br2($arg){print(nl2br(str_replace(' ','&nbsp;',print_r($arg,true))));}
Kokos
31-Jan-2008 12:52
A simple function that will output an array more easily to read than print_r();

<?php
function echo_array($array,$return_me=false){
    if(
is_array($array) == false){
       
$return = "The provided variable is not an array.";
    }else{
        foreach(
$array as $name=>$value){
            if(
is_array($value)){
               
$return .= "";
               
$return .= "['<b>$name</b>'] {<div style='margin-left:10px;'>\n";
               
$return .= echo_array($value,true);
               
$return .= "</div>}";
               
$return .= "\n\n";
            }else{
                if(
is_string($value)){
                   
$value = "\"$value\"";
                }
               
$return .= "['<b>$name</b>'] = $value\n\n";
            }
        }
    }
    if(
$return_me == true){
        return
$return;
    }else{
        echo
"<pre>".$return."</pre>";
    }
}
?>
highstrike at gmail dot com
08-Jan-2008 01:34
made 2 nifty functions based of what some people contributed here. Hope you find them usefull

usage ... call for the dump function. EG: dump($array, "Array dump");

<?php
////////////////////////////////////////////////////////
// Function:         dump
// Inspired from:     PHP.net Contributions
// Description: Helps with php debugging

function dump(&$var, $info = FALSE)
{
   
$scope = false;
   
$prefix = 'unique';
   
$suffix = 'value';
 
    if(
$scope) $vals = $scope;
    else
$vals = $GLOBALS;

   
$old = $var;
   
$var = $new = $prefix.rand().$suffix; $vname = FALSE;
    foreach(
$vals as $key => $val) if($val === $new) $vname = $key;
   
$var = $old;

    echo
"<pre style='margin: 0px 0px 10px 0px; display: block; background: white; color: black; font-family: Verdana; border: 1px solid #cccccc; padding: 5px; font-size: 10px; line-height: 13px;'>";
    if(
$info != FALSE) echo "<b style='color: red;'>$info:</b><br>";
   
do_dump($var, '$'.$vname);
    echo
"</pre>";
}

////////////////////////////////////////////////////////
// Function:         do_dump
// Inspired from:     PHP.net Contributions
// Description: Better GI than print_r or var_dump

function do_dump(&$var, $var_name = NULL, $indent = NULL, $reference = NULL)
{
   
$do_dump_indent = "<span style='color:#eeeeee;'>|</span> &nbsp;&nbsp; ";
   
$reference = $reference.$var_name;
   
$keyvar = 'the_do_dump_recursion_protection_scheme'; $keyname = 'referenced_object_name';

    if (
is_array($var) && isset($var[$keyvar]))
    {
       
$real_var = &$var[$keyvar];
       
$real_name = &$var[$keyname];
       
$type = ucfirst(gettype($real_var));
        echo
"$indent$var_name <span style='color:#a2a2a2'>$type</span> = <span style='color:#e87800;'>&amp;$real_name</span><br>";
    }
    else
    {
       
$var = array($keyvar => $var, $keyname => $reference);
       
$avar = &$var[$keyvar];
   
       
$type = ucfirst(gettype($avar));
        if(
$type == "String") $type_color = "<span style='color:green'>";
        elseif(
$type == "Integer") $type_color = "<span style='color:red'>";
        elseif(
$type == "Double"){ $type_color = "<span style='color:#0099c5'>"; $type = "Float"; }
        elseif(
$type == "Boolean") $type_color = "<span style='color:#92008d'>";
        elseif(
$type == "NULL") $type_color = "<span style='color:black'>";
   
        if(
is_array($avar))
        {
           
$count = count($avar);
            echo
"$indent" . ($var_name ? "$var_name => ":"") . "<span style='color:#a2a2a2'>$type ($count)</span><br>$indent(<br>";
           
$keys = array_keys($avar);
            foreach(
$keys as $name)
            {
               
$value = &$avar[$name];
               
do_dump($value, "['$name']", $indent.$do_dump_indent, $reference);
            }
            echo
"$indent)<br>";
        }
        elseif(
is_object($avar))
        {
            echo
"$indent$var_name <span style='color:#a2a2a2'>$type</span><br>$indent(<br>";
            foreach(
$avar as $name=>$value) do_dump($value, "$name", $indent.$do_dump_indent, $reference);
            echo
"$indent)<br>";
        }
        elseif(
is_int($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color$avar</span><br>";
        elseif(
is_string($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color\"$avar\"</span><br>";
        elseif(
is_float($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color$avar</span><br>";
        elseif(
is_bool($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color".($avar == 1 ? "TRUE":"FALSE")."</span><br>";
        elseif(
is_null($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> {$type_color}NULL</span><br>";
        else echo
"$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $avar<br>";

       
$var = $var[$keyvar];
    }
}
?>
bart at mediawave dot nl
31-Oct-2007 12:27
Here's a PHP version of print_r which can be tailored to your needs. Shows protected and private properties of objects and detects recursion (for objects only!). Usage:

void u_print_r ( mixed $expression [, array $ignore] )

Use the $ignore parameter to provide an array of property names that shouldn't be followed recursively.

<?php

function u_print_r($subject, $ignore = array(), $depth = 1, $refChain = array())
{
    if (
$depth > 20) return;
    if (
is_object($subject)) {
        foreach (
$refChain as $refVal)
            if (
$refVal === $subject) {
                echo
"*RECURSION*\n";
                return;
            }
       
array_push($refChain, $subject);
        echo
get_class($subject) . " Object ( \n";
       
$subject = (array) $subject;
        foreach (
$subject as $key => $val)
            if (
is_array($ignore) && !in_array($key, $ignore, 1)) {
                echo
str_repeat(" ", $depth * 4) . '[';
                if (
$key{0} == "\0") {
                   
$keyParts = explode("\0", $key);
                    echo
$keyParts[2] . (($keyParts[1] == '*')  ? ':protected' : ':private');
                } else
                    echo
$key;
                echo
'] => ';
               
u_print_r($val, $ignore, $depth + 1, $refChain);
            }
        echo
str_repeat(" ", ($depth - 1) * 4) . ")\n";
       
array_pop($refChain);
    } elseif (
is_array($subject)) {
        echo
"Array ( \n";
        foreach (
$subject as $key => $val)
            if (
is_array($ignore) && !in_array($key, $ignore, 1)) {
                echo
str_repeat(" ", $depth * 4) . '[' . $key . '] => ';
               
u_print_r($val, $ignore, $depth + 1, $refChain);
            }
        echo
str_repeat(" ", ($depth - 1) * 4) . ")\n";
    } else
        echo
$subject . "\n";
}

?>

Example:

<?php

class test {

    public
$var1 = 'a';
    protected
$var2 = 'b';
    private
$var3 = 'c';
    protected
$array = array('x', 'y', 'z');

}

$test = new test();
$test->recursiveRef = $test;
$test->anotherRecursiveRef->recursiveRef = $test;
$test->dont->follow = 'me';

u_print_r($test, array('dont'));

?>

Will produce:

test Object (
    [var1] => a
    [var2:protected] => b
    [var3:private] => c
    [array:protected] => Array (
        [0] => x
        [1] => y
        [2] => z
    )
    [recursiveRef] => *RECURSION*
    [anotherRecursiveRef] => stdClass Object (
        [recursiveRef] => *RECURSION*
    )
)
php at deboom dot biz
21-Sep-2007 12:17
If you need to import an print_R output back to an array you could use this.

This could also be (ab)used to convert a object into a array...

<?php
function object2array($printr) {                   
       
$newarray = array();       
       
$a[0] = &$newarray;       
        if (
preg_match_all('/^\s+\[(\w+).*\] => (.*)\n/m', $printr, $match)) {                       
            foreach (
$match[0] as $key => $value) {   
                (int)
$tabs = substr_count(substr($value, 0, strpos($value, "[")), "        ");               
                if (
$match[2][$key] == 'Array' || substr($match[2][$key], -6) == 'Object') {                   
                   
$a[$tabs+1] = &$a[$tabs][$match[1][$key]];
                }                           
                else {
                   
$a[$tabs][$match[1][$key]] = $match[2][$key];                   
                }
            }
        }   
        return
$newarray;   
    }
?>
motin at demomusic dot nu
19-Jun-2007 11:01
This works around the hacky nature of print_r in return mode (using output buffering for the return mode to work is hacky...):

<?php
/**
  * An alternative to print_r that unlike the original does not use output buffering with
  * the return parameter set to true. Thus, Fatal errors that would be the result of print_r
  * in return-mode within ob handlers can be avoided.
  *
  * Comes with an extra parameter to be able to generate html code. If you need a
  * human readable DHTML-based print_r alternative, see http://krumo.sourceforge.net/
  *
  * Support for printing of objects as well as the $return parameter functionality
  * added by Fredrik Wollsén (fredrik dot motin at gmail), to make it work as a drop-in
  * replacement for print_r (Except for that this function does not output
  * paranthesises around element groups... ;) )
  *
  * Based on return_array() By Matthew Ruivo (mruivo at gmail)
  * (http://se2.php.net/manual/en/function.print-r.php#73436)
  */
function obsafe_print_r($var, $return = false, $html = false, $level = 0) {
   
$spaces = "";
   
$space = $html ? "&nbsp;" : " ";
   
$newline = $html ? "<br />" : "\n";
    for (
$i = 1; $i <= 6; $i++) {
       
$spaces .= $space;
    }
   
$tabs = $spaces;
    for (
$i = 1; $i <= $level; $i++) {
       
$tabs .= $spaces;
    }
    if (
is_array($var)) {
       
$title = "Array";
    } elseif (
is_object($var)) {
       
$title = get_class($var)." Object";
    }
   
$output = $title . $newline . $newline;
    foreach(
$var as $key => $value) {
        if (
is_array($value) || is_object($value)) {
           
$level++;
           
$value = obsafe_print_r($value, true, $html, $level);
           
$level--;
        }
       
$output .= $tabs . "[" . $key . "] => " . $value . $newline;
    }
    if (
$return) return $output;
      else echo
$output;
}
?>

Built on a function earlier posted in these comments as stated in the Doc comment. Cheers! /Fredrik (Motin)
mrasnika at users dot sourceforge dot net
26-Apr-2007 06:30
We can all agree that print_r() output is very spartan looking. The debug data needs to be organized better, and presented in a graceful way. In the era of Web 2.0 it is somewhat strange to use plain text to dump information. A DHTML powered informatiion dumping tool will be quite better - like the the open-source alternative of print_r(); -- Krumo (http://krumo.sourceforge.net).

It renders the output using DHTML and collapsible nodes, it's layout is "skinable" and you can change it to fit your aesthetic taste. Krumo makes the output "human-readable" for real :) Plus it is compliant with both PHP4 and PHP5. Plus it detects "reference recursion". Plus you can use it to dump all various sort of data like debug back-traces, the superglobals ($_SERVER, $_ENV, $_REQUEST, $_COOKIE, $_GET, $_POST, $_SESSION), all the included files, all the declared classes, all the declared constants, all your PHP settings, all your php.ini values (if it is readable), all the loaded extensions, all the HTTP request headers, all the declared interfaces (for PHP5), all the file paths from INCLUDE_PATH, all the values of any particular INI file. Additionally it is designed to be easy to use - for example you can disable all the Krumo dumps instead of cleaning your code out of all print_r()'s and var_dump()'s. Anyway, if you check the site (http://krumo.sourceforge.net), you can found a lot of examples, demonstrations, documentation and all sort of helpful information.
Enthusiastic PHPers
22-Mar-2007 08:03
We had an interesting problem dumping an