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

search for in the

serialize> <isset
Last updated: Fri, 16 May 2008

view this page in

print_r

(PHP 4, PHP 5)

print_r — Affiche des informations lisibles pour une variable

Description

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

print_r() affiche des informations à propos d'une variable, de manière à ce qu'elle soit lisible. Pour une chaîne, un entier ou un double, la valeur elle-même sera affichée. Pour les tableaux, les valeurs seront présentées dans un format qui montre les clés et les valeurs. Une notation similaire est disponible pour les objets. print_r(), var_dump() et var_export() afficheront également les propriétés protégées et privées d'un objet en PHP 5.

Gardez en tête que print_r() place le pointeur de tableau à la fin du tableau. Utilisez reset() pour le ramener au début.

Exemple #1 Exemple avec print_r()

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

L'exemple ci-dessus va afficher :

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

Si vous voulez obtenir le résultat de print_r() dans une chaîne, utilisez le paramètre return . Si ce paramètre vaut TRUE, print_r() retournera ce qu'il aurait affiché (ce qu'il fait par défaut).

Note: Cette fonction utilise en interne le buffer de sortie avec ce paramètre, il ne peut donc pas être utilisé dans la fonction de rappel ob_start().

Exemple #2 Utilisation du paramètre return de print_r()

<?php
$b 
= array ('m' => 'mangue''foo' => 'bar''x' => array ('x''y''z'));
$resultat print_r ($btrue);
//$resultat contient maintenant le résultat de print_r()
?>

Note: Si vous devez récupérer le résultat de print_r() avec une version de PHP plus ancienne que 4.3.0, utilisez les fonctions de bufferisation de sortie.

Note: Le paramètre return a été ajouté en PHP 4.3.0.

Note: Avant PHP 4.0.4, print_r() bouclera à l'infini si un tableau ou un objet contient une référence sur lui-même. Un exemple classique est notamment la ligne print_r($GLOBALS) car $GLOBALS est lui-même une variable globale, qui donc, contient une référence sur elle même.

Voir aussi ob_start(), var_dump() et var_export().



serialize> <isset
Last updated: Fri, 16 May 2008
 
add a note add a note User Contributed Notes
print_r
janci
13-May-2008 11: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 02: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 11: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 05: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 07: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 09: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
07-Feb-2008 12: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 01: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 02: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 01: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 02: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
20-Jun-2007 01: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 08: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 09:03
We had an interesting problem dumping an object that
contained embedded HTML. The application makes use
of buffer manipulation functions, so print_r's 2nd argument
wasn't helpful. Here is how we solved the problem:

$object = new ObjectContainingHTML();
$savedbuffercontents = ob_get_clean();
print_r($object);
$print_r_output = ob_get_clean();
ob_start();
echo $savedbuffercontents;
echo htmlentities($print_r_output);
mading25 at hotmail dot com
01-Mar-2007 08:34
None of the function to output to HTML was working for me so I had to write something that suited my needs. It's probably super not efficient but, hey it works well for me on a small scale.

function print_r_html($data,$return_data=false)
{
    $data = print_r($data,true);
    $data = str_replace( " ","&nbsp;", $data);
    $data = str_replace( "\r\n","<br>\r\n", $data);
    $data = str_replace( "\r","<br>\r", $data);
    $data = str_replace( "\n","<br>\n", $data);

    if (!$return_data)
        echo $data;   
    else
        return $data;
}

Simple, isn't? :)
Matthew Ruivo (mruivo at gmail)
23-Feb-2007 07:47
For those of you needing to print an array within a buffer callback function, I've created this quick function. It simply returns the array as a readable string rather than printing it. You can even choose whether to return it in normal text-mode or HTML. It's recursive, so multi-dimensial arrays are supported. I hope someone finds this useful!

<?php

   
function return_array($array, $html = false, $level = 0) {
       
$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;
        }
       
$output = "Array" . $newline . $newline;
        foreach(
$array as $key => $value) {
            if (
is_array($value)) {
               
$level++;
               
$value = return_array($value, $html, $level);
               
$level--;
            }
           
$output .= $tabs . "[" . $key . "] => " . $value . $newline;
        }
        return
$output;
    }

?>
sakabako at gmail dot com
07-Feb-2007 09:45
I've got four functions for printing arrays out in a readable fashion, I hope someone finds them useful.

//prints an array in a HTML table. Top row is the keys.
function table( $array ) {
    $array = array_values( $array );
   
    $keys = array_keys( $array[0] );
   
    echo '<table border="1"><tr>';
    foreach( $keys as $key ) {
        echo '<td>'.$key.'</td>';
    }
    echo '</tr>';
   
    foreach( $array as $row ) {
        echo '<tr>';
        foreach( $row as $value ) {
            echo '<td>'.$value.'</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}

//print_r enclosed in a <pre>, except it will always print something, even if the variable is null, number 0 or false. It also lets you label the dump.
function dump( $var, $label=null ) {
    if( $var === '' or $var === null or $var === 0 ) {
        var_dump( $var );
        return;
    }
    echo '<pre style="text-align: left; font-size: 10px;">';
    if( $label ) {
        echo $label."\n";
    }
    print_r( $var );
    echo '</pre>';
}

//This one gives you output you can copy and paste back into your PHP code to recreate the array.
function dump_array( $array, $tabs=1 ) {
    $html = "<pre style=\"text-align: left; font-size: 10px;\">array( \n";
    foreach( $array as $key => $val ) {
        $html .= str_repeat( "\t", $tabs )."'$key' => ";
        if( is_array( $val ) ) {
            $html .= dump_array( $array, $tabs+1 );
        } else {
            $html .= "'$val',\n";
        }
    }
    $html .= ')</pre>';
    return $html;
}

//just add header( 'content-type: application/vnd.ms-excel' ) and you've got an excel file.
function excel( $array ) {
    $array = array_values( $array );
   
    $keys = array_keys( $array[0] );
   
    foreach( $keys as $key ) {
        echo $key."\t";
    }
    echo "\n";
   
    foreach( $array as $row ) {
        foreach( $row as $value ) {
            echo $value."\t";
        }
        echo "\n";
    }
}
markus (at) maxxmaster (dot) org
17-Jan-2007 03:11
i've been using a similar idea like Sawey's for quite a long time,
but was always disappointed that you don't see the name of the
variable passed to the function (eg calling it many times, you don't
know which value was provided by a certain variable at a certain time).
so i combined sawey's idea with one found on php.net to solve that problem.
for shellscripting the function only uses <pre>-tags when called in the web.

<?php
/* how print_r should be ;) */
function my_r(&$var, $scope=false, $label=false){

  if (
is_string($scope) && $label==false) $label=$scope;
  if (!
is_array($scope)) $scope = &$GLOBALS;

 
$origin = $var;
 
$var = $checker = "very_weird_value#".rand()."#isnt_it";
 
$vname = false;

  foreach (
$scope as $key => $value){
    if (
$value === $checker){ $vname = "\$".$key; }
    if (
is_array($value) && $key!="GLOBALS"){
      if (
$pfad=aver($var,$value)){
       
$vname = "\$${key}[\"". implode("\"][\"",$pfad)."\"]";
      }
    }
    if (
is_object($value)){
      if (
$pfad=aver($var,get_object_vars($value))){
        if (
sizeof($pfad)<2) $vname = "\$${key}->".$pfad[0];
        else{
         
$vname ="\$${key}->".$pfad[0];
         
$vname.="[\"".implode("\"][\"", array_slice($pfad,1))."\"]";
        }
      }
    }
    if (
$vname) break;
  }
 
$var = $origin;

  if (
$_SERVER["SERVER_NAME"] && !isset($_SERVER["TERM"])) echo "<pre>";
  if (
$vname){
    echo
$vname;
    if (
$label) echo " #" . $label . "# ";
    else echo
": ";
  }else{
    if (
$label) echo "$label: ";
  }
 
print_r($var);
  if (
$_SERVER["SERVER_NAME"] && !isset($_SERVER["TERM"])) echo "</pre>";
}

/* this function is needed to check in multidimensional arrays
if the value of interest exists. if yes, the path is returned */
function aver($needle,$haystack) { // array value exists recursive
 
foreach($haystack as $key=>$val) {
    if(
is_array($val) && $needle != $val && $key != "GLOBALS") {
      if(
$foo=aver($needle,$val)) return array_merge(array($key),$foo);
    }elseif(
$val === $needle) return array($key);
  }
  return
false;
}
?>
markus (at) maxxmaster (d0t) org
17-Jan-2007 02:33
Explanation:
The problem with figuring out what value is what key in that variables scope is that several variables might have the same value.  To remedy this, the variable is passed by reference and its value is then modified to a random value to make sure there will be a unique match.  Then we loop through the scope ( semi recursively ) the variable is contained in and when there is a match of our modified value, we can grab the correct key and output the name.

Bugs:
You can see in the 5th Example, that the so-called non-existant variable infact exists ;|, the problem with referenced variables (as used in the my_r function) is, that they have to exist at call-time to reference them. that is why my_r("test") will result in a fatal error. if you have ideas to solve that, don't hesitate to mention them.

Examples:

1.  Use of a variable contained in the global scope (default):
<?php
  $my_global_variable
= array("nice", "try", "guybrush");
 
my_r($my_global_variable);

/* Outputs: 
$my_global_variable: Array
(
    [0] => nice
    [1] => try
    [2] => guybrush
)
*/
?>

2.  Use of a local variable (in a function):
<?php
function my_local_function()
{
 
$my_local_variable = array("nice", "try", "guybrush");
 
my_r($my_local_variable,get_defined_vars());
}
my_local_function();

/* Outputs: 
$my_local_variable: Array
(
    [0] => nice
    [1] => try
    [2] => guybrush
)
*/
?>

3.  Use of an object property:
<?php
class myclass{
 
public function __constructor(){ // depending on php version ;)
   
$this->my_object_property = array("nice", "try", name => array("guybrush"));
  }
 
public function myclass(){ // depending on php version ;)
   
$this->my_object_property = array("nice", "try", name => array("guybrush"));   
  }
}

$obj = new myclass;
my_r($obj->my_object_property);
/* Outputs:
$obj->my_object_property: Array
(
    [0] => nice
    [1] => try
    [name] => Array
        (
            [0] => guybrush
        )

)
*/
?>

4. Use of a sub-array and an additional label
<?php
$foo
=array("nice","try",name => array("guybrush","threapwood"))
my_r($foo["name"],"position 1");
/* Outputs:
$foo["name"] #position 1# Array
(
    [0] => guybrush
    [1] => threapwood
)
*/
?>

5. Use of non existant Variables (standard-behaviour of print_r)
<?php
my_r
($foo=array("nice","try","guybrush"));
/* Outputs:
Array
(
    [0] => nice
    [1] => try
    [2] => guybrush
)
*/
?>
SaWey @ localdomain
15-Jan-2007 08:44
I've seen a lot of tries to give an easy way to output the "print_r" info in a decent way in you favorite browser.

Here's mine:

echo ("<pre>");
print_r("-->here goes your data to output<--");
echo ("<pre>");

I personaly think this is the easyest way.
Grz
auditor400 at gmail dot com
02-Nov-2006 04:56