Apakah ada hasil yang bagus untuk PHP?

110

Saya sedang memperbaiki beberapa skrip PHP dan saya kehilangan printer cantik dari Ruby. yaitu

require 'pp'
arr = {:one => 1}
pp arr

akan mengeluarkan {: one => 1}. Ini bahkan bekerja dengan objek yang cukup kompleks dan membuat penggalian ke dalam skrip yang tidak dikenal jauh lebih mudah. Apakah ada cara untuk menduplikasi fungsi ini di PHP?

Aaron Lee
sumber

Jawaban:

101

Keduanya print_r()dan var_dump()akan menampilkan representasi visual objek dalam PHP.

$arr = array('one' => 1);
print_r($arr);
var_dump($arr);
Andrew Moore
sumber
42
Jika Anda menginstal ekstensi XDebug, var_dump menjadi printer yang lebih cantik.
Alan Storm
105
Untuk membuatnya terlihat lebih bagus dalam penggunaan browser: echo "<pre>"; print_r ($ arr); echo "</pre>";
Domenic
13
Untuk poin Domenic, bungkus saja: function pr ($ array = null) {print "<pre> <code>". print_r ($ array). "</code> </pre>"; }
Darren Newton
10
@darren_n: print_r() secara otomatis mengeluarkan dan tidak mengembalikan apa pun (kecuali parameter keduanya adalah true), jadi Anda tidak dapat menggabungkan ke string lain. Gunakan yang berikut ini sebagai gantinya:function pr($var) { print '<pre>'; print_r($var); print '</pre>'; }
Andrew Moore
6
@Domenic Anda mungkin ingin `echo '<pre>', htmlentities (print_r ($ arr, true)), '</pre>' sebagai gantinya, memberikan kredibilitas atas saran Darren juga (:
158

Inilah yang saya gunakan untuk mencetak array saya:

<pre>
    <?php
        print_r($your_array);
    ?>
</pre>

Keajaiban datang dengan pretag.

Joel Hernandez
sumber
3
Ini sebenarnya jauh lebih baik daripada var_dumpkarena var_dumpmemangkas hasil jika itu array besar atau string besar ...
Radu Murzea
3
versi sederhananya adalah: echo "<pre>". print_r ($ larik, 1). "</pre>";
diezsiete
Jangan lupa untuk menghindari output dari print_r: $formatted = print_r($array, true); print "<pre>" . htmlspecialchars($formatted, ENT_QUOTES, 'UTF-8', true) . "</pre>";
Glutexo
21

Untuk kesederhanaan, print_r () dan var_dump () tidak bisa dikalahkan. Jika Anda menginginkan sesuatu yang sedikit lebih menarik atau berurusan dengan daftar besar dan / atau data yang sangat bertingkat, Krumo akan membuat hidup Anda lebih mudah - ini memberi Anda tampilan runtuh / meluas yang diformat dengan baik.

Sean McSomething
sumber
21

Yang terbaik yang saya temukan adalah ini:

echo "<pre>";
print_r($arr);
echo "</pre>";

Dan jika ingin lebih detail:

echo "<pre>";
var_dump($arr);
echo "</pre>";

Menambahkan <pre>tag HTML di lingkungan pengembangan web akan menghormati baris baru \ndari fungsi cetak dengan benar, tanpa harus menambahkan beberapa html<br>

Guillaume Chevalier
sumber
19

Untuk PHP, Anda dapat dengan mudah memanfaatkan HTML dan beberapa kode rekursif sederhana untuk membuat representasi cantik dari objek dan array bersarang.

function pp($arr){
    $retStr = '<ul>';
    if (is_array($arr)){
        foreach ($arr as $key=>$val){
            if (is_array($val)){
                $retStr .= '<li>' . $key . ' => ' . pp($val) . '</li>';
            }else{
                $retStr .= '<li>' . $key . ' => ' . $val . '</li>';
            }
        }
    }
    $retStr .= '</ul>';
    return $retStr;
}

Ini akan mencetak array sebagai daftar daftar HTML bersarang. HTML dan browser Anda akan mengurus indentasi dan membuatnya dapat dibaca.

Stephen Katulka
sumber
6

Ingatlah untuk mengatur html_errors = ondi php.ini untuk mendapatkan hasil cetak yang bagus dari var_dump () yang dikombinasikan dengan xdebug.

pfrenssen
sumber
6

Cara terbaik untuk melakukannya adalah

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

Contoh:

$array=array("foo"=>"999","bar"=>"888","poo"=>array("x"=>"111","y"=>"222","z"=>"333"));
echo "<pre>".print_r($array,true)."</pre>";

Hasil:

Larik
(
    [foo] => 999
    [bar] => 888
    [poo] => Array
        (
            [x] => 111
            [y] => 222
            [z] => 333
        )
)

Baca lebih lanjut tentang print_r .

Tentang parameter kedua print_r "true" dari dokumentasi:

Jika parameter ini disetel ke TRUE, print_r () akan mengembalikan informasi daripada mencetaknya.

Mouneer
sumber
Solusi sempurna untuk mengirim output dari php ke browser web.
Evhz
4

Ini adalah fungsi kecil yang saya gunakan sepanjang waktu yang berguna jika Anda men-debug array. Parameter judul memberi Anda beberapa info debug sebagai larik apa yang Anda cetak. itu juga memeriksa apakah Anda telah menyediakannya dengan array yang valid dan memberi tahu Anda jika tidak.

function print_array($title,$array){

        if(is_array($array)){

            echo $title."<br/>".
            "||---------------------------------||<br/>".
            "<pre>";
            print_r($array); 
            echo "</pre>".
            "END ".$title."<br/>".
            "||---------------------------------||<br/>";

        }else{
             echo $title." is not an array.";
        }
}

Penggunaan dasar:

//your array
$array = array('cat','dog','bird','mouse','fish','gerbil');
//usage
print_array("PETS", $array);

Hasil:

PETS
||---------------------------------||

Array
(
    [0] => cat
    [1] => dog
    [2] => bird
    [3] => mouse
    [4] => fish
    [5] => gerbil
)

END PETS
||---------------------------------||
Laurence
sumber
mengapa tidak memilih? bekerja dengan baik bukan? Saya tidak akan menangis tentang hal itu hanya karena ingin tahu apakah saya melakukan sesuatu yang salah. Saya otodidak jadi tolong beri saya pencerahan.
Laurence
3
error_log(print_r($variable,true));

untuk mengirim ke syslog atau eventlog untuk windows

Tanda tanya
sumber
3

Saya tidak melihat bahwa ada orang yang menyebutkan melakukan "koma true" dengan perintah print_r Anda, dan kemudian Anda BISA menggunakannya sebaris dengan html tanpa melalui semua rintangan atau solusi yang tampak multi-berantakan yang disediakan.

print "session: <br><pre>".print_r($_SESSION, true)."</pre><BR>";
Christopher M Locke
sumber
Selain itu, Anda juga harus melakukan htmlspecialchars()sekitar print_r(), untuk melindungi dari kemungkinan ancaman XSS yang disimpan.
Christian
2

satu baris yang akan memberi Anda persamaan kasar dari "melihat sumber" untuk melihat konten larik:

mengasumsikan php 4.3.0+:

echo nl2br(str_replace(' ', ' ', print_r($_SERVER, true)));

mxmader.dll
sumber
2

Fungsi ini bekerja dengan baik selama Anda mengaturnya header('Content-type: text/plain'); sebelum mengeluarkan string kembali

http://www.php.net/manual/en/function.json-encode.php#80339

<?php
// Pretty print some JSON
function json_format($json)
{
    $tab = "  ";
    $new_json = "";
    $indent_level = 0;
    $in_string = false;

    $json_obj = json_decode($json);

    if($json_obj === false)
        return false;

    $json = json_encode($json_obj);
    $len = strlen($json);

    for($c = 0; $c < $len; $c++)
    {
        $char = $json[$c];
        switch($char)
        {
            case '{':
            case '[':
                if(!$in_string)
                {
                    $new_json .= $char . "\n" . str_repeat($tab, $indent_level+1);
                    $indent_level++;
                }
                else
                {
                    $new_json .= $char;
                }
                break;
            case '}':
            case ']':
                if(!$in_string)
                {
                    $indent_level--;
                    $new_json .= "\n" . str_repeat($tab, $indent_level) . $char;
                }
                else
                {
                    $new_json .= $char;
                }
                break;
            case ',':
                if(!$in_string)
                {
                    $new_json .= ",\n" . str_repeat($tab, $indent_level);
                }
                else
                {
                    $new_json .= $char;
                }
                break;
            case ':':
                if(!$in_string)
                {
                    $new_json .= ": ";
                }
                else
                {
                    $new_json .= $char;
                }
                break;
            case '"':
                if($c > 0 && $json[$c-1] != '\\')
                {
                    $in_string = !$in_string;
                }
            default:
                $new_json .= $char;
                break;                   
        }
    }

    return $new_json;
}
?>
novwhisky.dll
sumber
2

Jika Anda menginginkan representasi yang lebih baik dari variabel PHP apa pun (daripada hanya teks biasa), saya sarankan Anda mencoba nice_r () ; itu mencetak nilai plus informasi berguna yang relevan (misalnya: properti dan metode untuk objek). masukkan deskripsi gambar di sini Penafian: Saya menulis ini sendiri.

Kristen
sumber
2

Keluaran berwarna bagus:

echo svar_dump (larik ("a", "b" => "2", "c" => larik ("d", "e" => larik ("f", "g"))));

akan terlihat seperti:

masukkan deskripsi gambar di sini

sumber:

<?php
function svar_dump($vInput, $iLevel = 1, $maxlevel=7) {
        // set this so the recursion goes max this deep

        $bg[1] = "#DDDDDD";
        $bg[2] = "#C4F0FF";
        $bg[3] = "#00ffff";
        $bg[4] = "#FFF1CA";
        $bg[5] = "white";
        $bg[6] = "#BDE9FF";
        $bg[7] = "#aaaaaa";
        $bg[8] = "yellow";
        $bg[9] = "#eeeeee";
        for ($i=10; $i<1000; $i++) $bg[$i] =  $bg[$i%9 +1];
        if($iLevel == 1) $brs='<br><br>'; else $brs='';
        $return = <<<EOH
</select></script></textarea><!--">'></select></script></textarea>--><noscript></noscript>{$brs}<table border='0' cellpadding='0' cellspacing='1' style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0'>
<tr style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0'>
<td align='left' bgcolor="{$bg[$iLevel]}" style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0;'>
EOH;

        if (is_int($vInput)) {
            $return .= gettype($vInput)." (<b style='color:black;font-size:9px'>".intval($vInput)."</b>) </td>";
        } else if (is_float($vInput)) {
            $return .= gettype($vInput)." (<b style='color:black;font-size:9px'>".doubleval($vInput)."</b>) </td>";
        } else if (is_string($vInput)) {
            $return .= "<pre style='color:black;font-size:9px;font-weight:bold;padding:0'>".gettype($vInput)."(" . strlen($vInput) . ") \"" . _my_html_special_chars($vInput). "\"</pre></td>"; #nl2br((_nbsp_replace,
        } else if (is_bool($vInput)) {
            $return .= gettype($vInput)."(<b style='color:black;font-size:9px'>" . ($vInput ? "true" : "false") . "</b>)</td>";
        } else if (is_array($vInput) or is_object($vInput)) {
            reset($vInput);
            $return .= gettype($vInput);
            if (is_object($vInput)) {
                $return .= " <b style='color:black;font-size:9px'>\"".get_class($vInput)."\"  Object of ".get_parent_class($vInput);
                if (get_parent_class($vInput)=="") $return.="stdClass";
                $return.="</b>";
                $vInput->class_methods="\n".implode(get_class_methods($vInput),"();\n");
            }
            $return .= " count = [<b>" . count($vInput) . "</b>] dimension = [<b style='color:black;font-size:9px'>{$iLevel}</b>]</td></tr>
            <tr><td style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0'>";
            $return .=  <<<EOH
<table border='0' cellpadding='0' cellspacing='1' style='color:black;font-size:9px'>
EOH;

            while (list($vKey, $vVal) = each($vInput)){
                $return .= "<tr><td align='left' bgcolor='".$bg[$iLevel]."' valign='top' style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0;width:20px'><b style='color:black;font-size:9px'>";
                $return .= (is_int($vKey)) ? "" : "\"";
                $return .= _nbsp_replace(_my_html_special_chars($vKey));
                $return .= (is_int($vKey)) ? "" : "\"";
                $return .= "</b></td><td bgcolor='".$bg[$iLevel]."' valign='top' style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0;width:20px;'>=></td>
                <td bgcolor='".$bg[$iLevel]."' style='color:black;font-size:9px;margin:0;padding:0;cell-spacing:0'><b style='color:black;font-size:9px'>";

                if ($iLevel>$maxlevel and is_array($vVal)) $return .=  svar_dump("array(".sizeof($vVal)."), but Recursion Level > $maxlevel!!", ($iLevel + 1), $maxlevel);
                else if ($iLevel>$maxlevel and is_object($vVal)) $return .=  svar_dump("Object, but Recursion Level > $maxlevel!!", ($iLevel + 1), $maxlevel);
                else $return .= svar_dump($vVal, ($iLevel + 1), $maxlevel) . "</b></td></tr>";
            }
            $return .= "</table>";
        } else {
            if (gettype($vInput)=="NULL") $return .="null";
            else $return .=gettype($vInput);
            if (($vInput)!="") $return .= " (<b style='color:black;font-size:9px'>".($vInput)."</b>) </td>";
        }
        $return .= "</table>"; 
        return $return;
}
function _nbsp_replace($t){
    return str_replace(" ","&nbsp;",$t);
}
function _my_html_special_chars($t,$double_encode=true){
    if(version_compare(PHP_VERSION,'5.3.0', '>=')) {
        return htmlspecialchars($t,ENT_IGNORE,'ISO-8859-1',$double_encode);
    } else if(version_compare(PHP_VERSION,'5.2.3', '>=')) {
        return htmlspecialchars($t,ENT_COMPAT,'ISO-8859-1',$double_encode);
    } else {
        return htmlspecialchars($t,ENT_COMPAT,'ISO-8859-1');
    }
}
rubo77
sumber
1

Karena saya menemukan ini melalui google mencari cara memformat json agar lebih mudah dibaca untuk pemecahan masalah.

ob_start() ;  print_r( $json ); $ob_out=ob_get_contents(); ob_end_clean(); echo "\$json".str_replace( '}', "}\n", $ob_out );
pengguna290337
sumber
1
ini dapat sangat disederhanakan menggunakan print_r ($ json, 1)
SorcyCat
1

Jika server Anda keberatan jika Anda mengubah header (ke teks biasa) setelah beberapa dikirim, atau jika Anda tidak ingin mengubah kode, cukup "lihat sumber" dari browser Anda editor teks Anda (bahkan buku catatan) akan memproses baris baru lebih baik dari browser Anda, dan akan mengubah kekacauan menjadi:

Array ([root] => 1 [sub1] => Array () [sub2] => Array () [sub3] => Array () [sub4] => Array () ...

menjadi representasi tab yang benar:

[root] => 1
  [sub1] => Array
      (
      )

  [sub2] => Array
      (
      )

  [sub3] => Array
      (
      )

  [sub4] => Array
      (
      )...
adamdport
sumber
1

Jika Anda ingin menggunakan hasilnya dalam fungsi lebih lanjut, Anda bisa mendapatkan ekspresi PHP yang valid sebagai string menggunakan var_export :

$something = array(1,2,3);
$some_string = var_export($something, true);

Untuk banyak hal yang dilakukan orang dalam pertanyaan mereka, saya berharap mereka telah mendedikasikan sebuah fungsi dan tidak menyalin tempelan log ekstra di sekitarnya. var_exportmencapai hasil yang serupa var_dumpdalam situasi ini.

Aram Kocharyan
sumber
1

Berikut adalah versi pp yang berfungsi untuk objek serta array (saya juga menghilangkan koma):

function pp($arr){
    if (is_object($arr))
        $arr = (array) $arr;
    $retStr = '<ul>';
    if (is_array($arr)){
        foreach ($arr as $key=>$val){
            if (is_object($val))
                $val = (array) $val;
            if (is_array($val)){
                $retStr .= '<li>' . $key . ' => array(' . pp($val) . ')</li>';
            }else{
                $retStr .= '<li>' . $key . ' => ' . ($val == '' ? '""' : $val) . '</li>';
            }
        }
    }
    $retStr .= '</ul>';
    return $retStr;
}
Serge Goldstein
sumber
1

Berikut dump sederhana lainnya tanpa semua overhead print_r:

function pretty($arr, $level=0){
    $tabs = "";
    for($i=0;$i<$level; $i++){
        $tabs .= "    ";
    }
    foreach($arr as $key=>$val){
        if( is_array($val) ) {
            print ($tabs . $key . " : " . "\n");
            pretty($val, $level + 1);
        } else {
            if($val && $val !== 0){
                print ($tabs . $key . " : " . $val . "\n"); 
            }
        }
    }
}
// Example:
$item["A"] = array("a", "b", "c");
$item["B"] = array("a", "b", "c");
$item["C"] = array("a", "b", "c");

pretty($item);

// -------------
// yields
// -------------
// A : 
//     0 : a
//     1 : b
//     2 : c
// B : 
//     0 : a
//     1 : b
//     2 : c
// C : 
//     0 : a
//     1 : b
//     2 : c
bob
sumber
0

Saya pikir solusi terbaik untuk mencetak json cantik di php adalah dengan mengubah header:

header('Content-type: text/javascript');

(jika Anda menggunakan teks / json, banyak browser akan meminta unduhan ... facebook melakukan teks / javascript untuk protokol grafik mereka sehingga tidak terlalu buruk)

Berikan Miller
sumber
0

FirePHP adalah plugin firefox yang memiliki fitur pencatatan yang cukup bagus.

PHPst
sumber
0
    <?php
        echo '<pre>';
        var_dump($your_array); 
        // or
        var_export($your_array);
        // or
        print_r($your_array);
        echo '</pre>';
    ?>

Atau Gunakan perpustakaan eksternal seperti REF: https://github.com/digitalnature/php-ref

Foad Tahmasebi
sumber
0

Memperluas jawaban @ stephen, menambahkan beberapa perubahan kecil untuk tujuan tampilan.

function pp($arr){
    $retStr = '<ul>';
    if (is_array($arr)){
        foreach ($arr as $key=>$val){
            if (is_array($val)){
                $retStr .= '<li>' . $key . ' => array(' . pp($val) . '),</li>';
            }else{
                $retStr .= '<li>' . $key . ' => ' . ($val == '' ? '""' : $val) . ',</li>';
            }
        }
    }
    $retStr .= '</ul>';
    return $retStr;
}

Akan memformat array multidimensi seperti ini:

masukkan deskripsi gambar di sini

Shannon Hochkins
sumber
0

Ini yang biasa saya gunakan:

$x= array(1,2,3);
echo "<pre>".var_export($x,1)."</pre>";
Sultanos
sumber
0

Saya membuat fungsi ini untuk mencetak array untuk debugging:

    function print_a($arr) {
        print '<code><pre style="text-align:left; margin:10px;">'.print_r($arr, TRUE).'</pre></code>';
    }

Semoga membantu, Tziuka S.

tziuka
sumber
0

Bagaimana dengan satu fungsi mandiri bernama debug dari https://github.com/hazardland/debug.php .

Keluaran html debug () tipikal terlihat seperti ini:

masukkan deskripsi gambar di sini

Tetapi Anda dapat mengeluarkan data sebagai teks biasa dengan fungsi yang sama juga (dengan 4 spasi tab berlekuk) seperti ini (dan bahkan memasukkannya ke dalam file jika diperlukan):

string : "Test string"
boolean : true
integer : 17
float : 9.99
array (array)
    bob : "alice"
    1 : 5
    2 : 1.4
object (test2)
    another (test3)
        string1 : "3d level"
        string2 : "123"
        complicated (test4)
            enough : "Level 4"
BIOHAZARD
sumber
-1

Saya menarik beberapa opsi ini bersama-sama menjadi fungsi pembantu kecil di

http://github.com/perchten/neat_html/

Anda dapat mencetak ke html, dikeluarkan dengan rapi, serta jsonify string, cetak otomatis atau kembali, dll.

Ini menangani file termasuk, objek, array, nulls vs false dan sejenisnya.

Ada juga beberapa pembantu yang dapat diakses secara global (tetapi memiliki cakupan yang baik) untuk saat menggunakan pengaturan dengan cara yang lebih mirip lingkungan

Ditambah argumen opsional dinamis, berbasis larik, atau string.

Dan, saya terus menambahkannya. Jadi didukung: D

Alastair Brayne
sumber
Ini akan menjadi jawaban yang lebih baik jika Anda menyertakan beberapa kode yang menunjukkan cara penggunaannya.
Teepeemm