Có một bản in đẹp cho PHP không?


110

Tôi đang sửa một số tập lệnh PHP và tôi thiếu máy in đẹp của ruby. I E

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

sẽ xuất ra {: one => 1}. Điều này thậm chí hoạt động với các đối tượng khá phức tạp và làm cho việc đào sâu vào một tập lệnh không xác định dễ dàng hơn nhiều. Có cách nào để sao chép chức năng này trong PHP không?

Câu trả lời:


101

Cả hai print_r()var_dump()sẽ xuất ra các biểu diễn trực quan của các đối tượng trong PHP.

$arr = array('one' => 1);
print_r($arr);
var_dump($arr);

42
Nếu bạn cài đặt phần mở rộng XDebug, var_dump sẽ trở thành một máy in thậm chí còn đẹp hơn.
Alan Storm

105
Để làm cho nó trông đẹp hơn trong trình duyệt, hãy sử dụng: echo "<pre>"; print_r ($ arr); echo "</pre>";
Domenic

13
Đối với quan điểm của Domenic chỉ cần bọc nó: function pr ($ array = null) {print "<pre> <code>". print_r ($ mảng). "</code> </pre>"; }
Darren Newton

10
@darren_n: print_r() tự động xuất ra và không trả về bất kỳ thứ gì (trừ khi tham số thứ hai của nó là true), vì vậy bạn không thể nối với một chuỗi khác. Sử dụng những điều sau đây thay vì:function pr($var) { print '<pre>'; print_r($var); print '</pre>'; }
Andrew Moore

6
@Domenic Thay vào đó, bạn có thể sẽ muốn `` echo '<pre>', htmlentities (print_r ($ arr, true)), '</pre>', đồng thời cho thấy sự tin cậy đối với gợi ý của Darren (:

158

Đây là những gì tôi sử dụng để in các mảng của mình:

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

Điều kỳ diệu đi kèm với prethẻ.


3
Đây thực sự là tốt hơn nhiều so var_dumpvar_dumpTrims kết quả nếu đó là một mảng lớn hoặc một chuỗi lớn ...
Radu Murzea

3
một phiên bản đơn giản sẽ là: echo "<pre>". print_r ($ mảng, 1). "</pre>";
kubio

Đừng quên thoát khỏi đầu ra của print_r: $formatted = print_r($array, true); print "<pre>" . htmlspecialchars($formatted, ENT_QUOTES, 'UTF-8', true) . "</pre>";
Glutexo

21

Để đơn giản, không thể đánh bại print_r ()var_dump () . Nếu bạn muốn thứ gì đó lạ mắt hơn một chút hoặc đang xử lý các danh sách lớn và / hoặc dữ liệu được lồng sâu vào nhau, Krumo sẽ làm cho cuộc sống của bạn dễ dàng hơn nhiều - nó cung cấp cho bạn một màn hình thu gọn / mở rộng được định dạng độc đáo.


21

Điều tốt nhất tôi tìm thấy là:

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

Và nếu bạn muốn nó chi tiết hơn:

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

Thêm <pre>thẻ HTML trong môi trường phát triển web sẽ tôn trọng các dòng mới \ncủa chức năng in một cách chính xác mà không cần phải thêm một số html<br>


19

Đối với PHP, bạn có thể dễ dàng tận dụng lợi thế của HTML và một số mã đệ quy đơn giản để tạo ra một biểu diễn đẹp của các mảng và đối tượng lồng nhau.

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;
}

Thao tác này sẽ in mảng dưới dạng danh sách các danh sách HTML lồng nhau. HTML và trình duyệt của bạn sẽ đảm nhận việc thụt lề và làm cho nó dễ đọc.



6

Hãy nhớ đặt html_errors = ontrong php.ini để có được bản in đẹp của var_dump () kết hợp với xdebug.


6

Cách tốt nhất để làm điều này là

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

Thí dụ:

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

Kết quả:

Mảng
(
    [foo] => 999
    [bar] => 888
    [poo] => Mảng
        (
            [x] => 111
            [y] => 222
            [z] => 333
        )
)

Đọc thêm về print_r .

Giới thiệu về tham số thứ hai của print_r "true" từ tài liệu:

Khi tham số này được đặt thành TRUE, print_r () sẽ trả về thông tin thay vì in ra.


Giải pháp hoàn hảo để gửi đầu ra từ php tới trình duyệt web.
Evhz

4

Đây là một chức năng nhỏ mà tôi sử dụng mọi lúc, nó tiện dụng nếu bạn đang gỡ lỗi mảng. Tham số tiêu đề cung cấp cho bạn một số thông tin gỡ lỗi như mảng bạn đang in. nó cũng kiểm tra xem bạn đã cung cấp cho nó một mảng hợp lệ chưa và cho bạn biết nếu bạn chưa cung cấp.

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.";
        }
}

Cách sử dụng cơ bản:

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

Các kết quả:

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

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

END PETS
||---------------------------------||

tại sao lại phản đối? hoạt động tốt phải không? Tôi sẽ không khóc vì điều đó chỉ tò mò nếu tôi đang làm gì đó sai. Tôi tự học nên xin hãy khai sáng cho tôi.
Laurence

3
error_log(print_r($variable,true));

để gửi đến nhật ký hệ thống hoặc nhật ký sự kiện cho windows


3

Nếu bạn đang thực hiện gỡ lỗi nhiều hơn, Xdebug là điều cần thiết. Theo mặc định, nó ghi đè var_dump()bằng phiên bản riêng của nó, hiển thị nhiều thông tin hơn mặc định của PHPvar_dump() .

Ngoài ra còn có Zend_Debug .


2
Blarg. Kết xuất var của Xdebug tệ vì nó xuất ra HTML ... Ồ đúng rồi, trông thật tuyệt trong bài kiểm tra CLI.
jason

Xdebug sử dụng các đầu ra khác nhau cho CLI ngày nay.
Jeff Hubbard

3

Tôi không thấy bất kỳ ai đề cập đến việc thực hiện "dấu phẩy true" với lệnh print_r của bạn và sau đó bạn CÓ THỂ sử dụng nó nội tuyến với html mà không cần thực hiện tất cả các vòng lặp hoặc các giải pháp trông có vẻ lộn xộn được cung cấp.

print "session: <br><pre>".print_r($_SESSION, true)."</pre><BR>";

Ngoài ra, bạn cũng nên làm htmlspecialchars()xung quanh print_r(), để bảo vệ khỏi các mối đe dọa XSS có thể được lưu trữ.
Christian

2

một lớp lót sẽ cung cấp cho bạn tính năng tương đương thô với "nguồn xem" để xem nội dung mảng:

giả sử php 4.3.0+:

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


2

Hàm này hoạt động khá tốt miễn là bạn đặt header('Content-type: text/plain');trước khi xuất chuỗi trả về

http://www.php.net/manual/en/ Chức năng.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;
}
?>

2

Nếu bạn muốn có một biểu diễn đẹp hơn của bất kỳ biến PHP nào (hơn là chỉ văn bản thuần túy), tôi khuyên bạn nên thử nice_r () ; nó in ra các giá trị cộng với thông tin hữu ích có liên quan (ví dụ: thuộc tính và phương thức cho các đối tượng). nhập mô tả hình ảnh ở đây Tuyên bố từ chối trách nhiệm: Tôi đã tự viết bài này.


2

Một đầu ra màu đẹp:

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

sẽ trông giống như:

nhập mô tả hình ảnh ở đây

nguồn:

<?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');
    }
}

1

Vì tôi đã tìm thấy điều này thông qua google tìm kiếm cách định dạng json để làm cho nó dễ đọc hơn để khắc phục sự cố.

ob_start() ;  print_r( $json ); $ob_out=ob_get_contents(); ob_end_clean(); echo "\$json".str_replace( '}', "}\n", $ob_out );

1
điều này có thể được đơn giản hóa đáng kể sử dụng print_r ($ json, 1)
SorcyCat

1

Nếu máy chủ của bạn phản đối việc bạn thay đổi tiêu đề (thành văn bản thuần túy) sau khi một số được gửi đi hoặc nếu bạn không muốn thay đổi mã của mình, chỉ cần "xem nguồn" từ trình duyệt của bạn - trình soạn thảo văn bản của bạn (thậm chí cả notepad) sẽ xử lý dòng mới tốt hơn trình duyệt của bạn và sẽ tạo ra một mớ hỗn độn:

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

thành một biểu diễn theo thẻ đúng cách:

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

  [sub2] => Array
      (
      )

  [sub3] => Array
      (
      )

  [sub4] => Array
      (
      )...

1

Nếu bạn muốn sử dụng kết quả trong các hàm khác, bạn có thể lấy biểu thức PHP hợp lệ dưới dạng chuỗi bằng cách sử dụng var_export :

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

Đối với rất nhiều thứ mà mọi người đang làm trong câu hỏi của họ, tôi hy vọng họ đã dành riêng một chức năng và không sao chép dán ghi nhật ký bổ sung xung quanh. var_exportđạt được đầu ra tương tự như var_dumptrong những tình huống này.


1

Đây là một phiên bản của pp hoạt động cho các đối tượng cũng như mảng (tôi cũng đã bỏ dấu phẩy):

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;
}

1

Đây là một kết xuất đơn giản khác mà không có tất cả chi phí của 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

0

Tôi nghĩ giải pháp tốt nhất để in json đẹp trong php là thay đổi tiêu đề:

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

(nếu bạn làm văn bản / json nhiều trình duyệt sẽ nhắc tải xuống ... facebook thực hiện văn bản / javascript cho giao thức đồ thị của họ nên nó không quá tệ)


0

FirePHP là một plugin firefox in có tính năng ghi nhật ký khá nhiều.



0

Mở rộng câu trả lời của @ stephen, đã thêm một vài chỉnh sửa rất nhỏ cho mục đích hiển thị.

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;
}

Sẽ định dạng bất kỳ mảng đa chiều nào như vậy:

nhập mô tả hình ảnh ở đây


0

Đây là những gì tôi thường sử dụng:

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

0

Tôi đã thực hiện hàm này để in một mảng để gỡ lỗi:

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

Hy vọng nó sẽ hữu ích, Tziuka S.


0

Còn về một hàm độc lập có tên là gỡ lỗi từ https://github.com/hazardland/debug.php .

Đầu ra html debug () điển hình giống như sau:

nhập mô tả hình ảnh ở đây

Nhưng bạn có thể xuất dữ liệu dưới dạng văn bản thuần túy có cùng chức năng (với 4 tab được thụt lề) như thế này (và thậm chí đăng nhập nó vào tệp nếu cần):

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"


-1

Tôi đã tập hợp một vài tùy chọn này lại thành một chức năng trợ giúp nhỏ nhỏ tại

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

Bạn có thể in ra html, xuất ra gọn gàng, cũng như jsonify chuỗi, tự động in hoặc trả về, v.v.

Nó xử lý tệp bao gồm, đối tượng, mảng, null so với false và những thứ tương tự.

Ngoài ra còn có một số trợ giúp có thể truy cập toàn cầu (nhưng phạm vi tốt) khi sử dụng cài đặt theo cách giống với môi trường hơn

Cộng với các đối số tùy chọn động, dựa trên mảng hoặc chuỗi.

Và, tôi tiếp tục thêm vào nó. Nên nó được hỗ trợ: D


Đây sẽ là một câu trả lời tốt hơn nếu bạn bao gồm một số mã hiển thị cách nó được sử dụng.
Teepeemm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.