PHP พิมพ์สวย ๆ ไหม


110

ฉันกำลังแก้ไขสคริปต์ PHP และเครื่องพิมพ์สวย ๆ ของ Ruby หายไป กล่าวคือ

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

จะส่งออก {: one => 1} สิ่งนี้ยังใช้งานได้กับวัตถุที่ค่อนข้างซับซ้อนและทำให้การขุดลงในสคริปต์ที่ไม่รู้จักทำได้ง่ายขึ้นมาก มีวิธีทำซ้ำฟังก์ชันนี้ใน PHP หรือไม่?

คำตอบ:


101

ทั้งสองprint_r()และvar_dump()จะส่งออกการแสดงภาพของวัตถุภายใน PHP

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

42
หากคุณติดตั้งส่วนขยาย XDebug var_dump จะกลายเป็นเครื่องพิมพ์ที่สวยกว่า
Alan Storm

105
เพื่อให้ดูดียิ่งขึ้นในเบราว์เซอร์ให้ใช้: echo "<pre>"; พิมพ์ _r ($ arr); เสียงสะท้อน "</pre>";
Domenic

13
ไปที่จุดของ Domenic เพียงแค่ตัดมัน: function pr ($ array = null) {print "<pre> <code>" print_r ($ array) "</code> </pre>"; }
Darren Newton

10
@darren_n: print_r()ส่งออกโดยอัตโนมัติและไม่ส่งคืนอะไรเลย (เว้นแต่พารามิเตอร์ที่สองคือtrue) ดังนั้นคุณจึงไม่สามารถเชื่อมต่อกับสตริงอื่นได้ ใช้สิ่งต่อไปนี้แทน:function pr($var) { print '<pre>'; print_r($var); print '</pre>'; }
Andrew Moore

6
@Domenic คุณน่าจะต้องการ `` echo '<pre>', htmlentities (print_r ($ arr, true)), '</pre>' แทนโดยให้ความน่าเชื่อถือกับคำแนะนำของ Darren ด้วยเช่นกัน (:

158

นี่คือสิ่งที่ฉันใช้ในการพิมพ์อาร์เรย์ของฉัน:

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

ความมหัศจรรย์มาพร้อมกับpreแท็ก


3
นี่เป็นสิ่งที่ดีกว่ามากvar_dumpเพราะvar_dumpจดจ้องผลลัพธ์หากเป็นอาร์เรย์ขนาดใหญ่หรือสตริงขนาดใหญ่ ...
Radu Murzea

3
เวอร์ชันที่เรียบง่ายจะเป็น: echo "<pre>" print_r ($ array, 1) "</pre>";
diezsiete

อย่าลืมหนีผลลัพธ์ของprint_r: $formatted = print_r($array, true); print "<pre>" . htmlspecialchars($formatted, ENT_QUOTES, 'UTF-8', true) . "</pre>";
Glutexo

21

เพื่อความเรียบง่ายไม่สามารถเอาชนะprint_r ()และvar_dump ()ได้ หากคุณต้องการบางสิ่งที่แปลกใหม่กว่านี้หรือกำลังจัดการกับรายการขนาดใหญ่และ / หรือข้อมูลที่ซ้อนกันอยู่ลึก ๆKrumoจะทำให้ชีวิตของคุณง่ายขึ้นมาก - มีการจัดรูปแบบการแสดงผลที่ยุบ / ขยายได้อย่างสวยงาม


21

สิ่งที่ดีที่สุดที่ฉันพบคือ:

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

และถ้าคุณต้องการรายละเอียดเพิ่มเติม:

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

การเพิ่ม<pre>แท็ก HTML ในสภาพแวดล้อมการพัฒนาเว็บจะปฏิบัติตามบรรทัดใหม่\nของฟังก์ชันการพิมพ์อย่างถูกต้องโดยไม่ต้องเพิ่ม html<br>


19

สำหรับ PHP คุณสามารถใช้ประโยชน์จาก HTML และโค้ดแบบเรียกซ้ำง่าย ๆ เพื่อแสดงอาร์เรย์และวัตถุที่ซ้อนกันได้อย่างสวยงาม

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

การดำเนินการนี้จะพิมพ์อาร์เรย์เป็นรายการ HTML ที่ซ้อนกัน HTML และเบราว์เซอร์ของคุณจะดูแลการเยื้องและทำให้อ่านง่าย



6

อย่าลืมตั้งค่าhtml_errors = onใน php.ini เพื่อให้สามารถพิมพ์ var_dump () ร่วมกับ xdebug ได้อย่างสวยงาม


6

วิธีที่ดีที่สุดคือ

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

ตัวอย่าง:

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

ผลลัพธ์:

อาร์เรย์
(
    [foo] => 999
    [bar] => 888
    [poo] => อาร์เรย์
        (
            [x] => 111
            [y] => 222
            [z] => 333
        )
)

อ่านเพิ่มเติมเกี่ยวกับprint_r

เกี่ยวกับพารามิเตอร์ที่สองของ print_r "true" จากเอกสารประกอบ:

เมื่อตั้งค่าพารามิเตอร์นี้เป็น TRUE print_r () จะส่งกลับข้อมูลแทนที่จะพิมพ์


โซลูชันที่สมบูรณ์แบบในการส่งเอาต์พุตจาก php ไปยังเว็บเบราว์เซอร์
Evhz

4

นี่เป็นฟังก์ชั่นเล็ก ๆ น้อย ๆ ที่ฉันใช้ตลอดเวลาซึ่งมีประโยชน์หากคุณกำลังดีบักอาร์เรย์ พารามิเตอร์ title ให้ข้อมูลการดีบักว่าคุณกำลังพิมพ์อาร์เรย์อะไร นอกจากนี้ยังตรวจสอบว่าคุณได้จัดหาอาร์เรย์ที่ถูกต้องหรือไม่และแจ้งให้คุณทราบหากคุณไม่ได้

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

การใช้งานพื้นฐาน:

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

ผล:

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

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

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

ทำไมต้องโหวตลง? ใช้งานได้ดีใช่หรือไม่? ฉันจะไม่ร้องไห้เกี่ยวกับเรื่องนี้แค่อยากรู้ว่าฉันทำอะไรผิด ฉันสอนตัวเองดังนั้นโปรดสอนฉันด้วย
Laurence


3

หากคุณกำลังทำการดีบักมากขึ้นXdebugเป็นสิ่งสำคัญ โดยค่าเริ่มต้นมันจะแทนที่var_dump()ด้วยรุ่นของตัวเองซึ่งแสดงเป็นจำนวนมากข้อมูลเพิ่มเติมกว่าค่าเริ่มต้นของ PHPvar_dump()

นอกจากนี้ยังมีZend_Debug


2
บลาร์ก. การถ่ายโอนข้อมูล var ของ Xdebug ดูดเนื่องจากเอาต์พุต HTML ... โอ้ใช่ดูดีมากในการทดสอบ CLI
สัน

Xdebug ใช้เอาต์พุตที่แตกต่างกันสำหรับ CLI ในปัจจุบัน
Jeff Hubbard

3

ฉันไม่เห็นว่ามีใครพูดถึงการทำ "comma true" ด้วยคำสั่ง print_r ของคุณจากนั้นคุณสามารถใช้มันแบบอินไลน์กับ html ได้โดยไม่ต้องใช้ห่วงหรือโซลูชันที่ดูยุ่งเหยิง

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

นอกจากนี้คุณควรทำhtmlspecialchars()รอบ ๆprint_r()เพื่อป้องกันภัยคุกคาม XSS ที่อาจจัดเก็บไว้
Christian

2

ซับเดียวที่จะให้คุณเทียบเท่ากับ "แหล่งการดู" แบบคร่าวๆเพื่อดูเนื้อหาอาร์เรย์:

ถือว่า php 4.3.0+:

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


2

ฟังก์ชันนี้ใช้งานได้ดีตราบเท่าที่คุณตั้งค่าheader('Content-type: text/plain');ก่อนที่จะส่งออกสตริงส่งคืน

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

2

หากคุณต้องการแสดงตัวแปร PHP ที่ดีกว่า (มากกว่าแค่ข้อความธรรมดา) ฉันขอแนะนำให้คุณลองnice_r () ; มันพิมพ์ค่าพร้อมข้อมูลที่เป็นประโยชน์ที่เกี่ยวข้อง (เช่นคุณสมบัติและวิธีการสำหรับวัตถุ) ใส่คำอธิบายภาพที่นี่ Disclaimer:ฉันเขียนสิ่งนี้ด้วยตัวเอง


2

เอาต์พุตสีที่สวยงาม:

echo svar_dump (อาร์เรย์ ("a", "b" => "2", "c" => อาร์เรย์ ("d", "e" => อาร์เรย์ ("f", "g"))));

จะมีลักษณะดังนี้:

ใส่คำอธิบายภาพที่นี่

ที่มา:

<?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

เนื่องจากฉันพบสิ่งนี้ผ่านทาง google ค้นหาวิธีการฟอร์แมต json เพื่อให้อ่านง่ายขึ้นสำหรับการแก้ไขปัญหา

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

1
สิ่งนี้สามารถทำให้ง่ายขึ้นอย่างมากโดยใช้ print_r ($ json, 1)
SorcyCat

1

หากเซิร์ฟเวอร์ของคุณคัดค้านการเปลี่ยนส่วนหัวของคุณ (เป็นข้อความธรรมดา) หลังจากที่ส่งไปแล้วหรือหากคุณไม่ต้องการเปลี่ยนโค้ดของคุณเพียงแค่ "ดูซอร์ส" จากเบราว์เซอร์ของคุณ -โปรแกรมแก้ไขข้อความของคุณ (แม้แต่แผ่นจดบันทึก) ก็จะดำเนินการ บรรทัดใหม่ที่ดีกว่าเบราว์เซอร์ของคุณและจะทำให้ยุ่งเหยิง:

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

ในการแสดงแท็บอย่างถูกต้อง:

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

  [sub2] => Array
      (
      )

  [sub3] => Array
      (
      )

  [sub4] => Array
      (
      )...

1

หากคุณต้องการใช้ผลลัพธ์ในฟังก์ชันเพิ่มเติมคุณสามารถรับนิพจน์ PHP ที่ถูกต้องเป็นสตริงโดยใช้var_export :

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

สำหรับหลาย ๆ สิ่งที่ผู้คนกำลังทำอยู่ในคำถามของพวกเขาฉันหวังว่าพวกเขาจะทุ่มเทฟังก์ชั่นนี้และไม่คัดลอกการบันทึกเพิ่มเติม var_exportบรรลุผลลัพธ์ที่คล้ายกันvar_dumpในสถานการณ์เหล่านี้


1

นี่คือเวอร์ชันของ pp ที่ใช้ได้กับอ็อบเจกต์และอาร์เรย์ (ฉันเอาเครื่องหมายจุลภาคออกด้วย):

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

นี่เป็นอีกหนึ่งการถ่ายโอนข้อมูลแบบง่ายโดยไม่มีค่าใช้จ่ายทั้งหมดของ 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

ฉันคิดว่าทางออกที่ดีที่สุดสำหรับการพิมพ์ json ใน php คือการเปลี่ยนส่วนหัว:

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

(ถ้าคุณทำ text / json หลาย ๆ เบราว์เซอร์จะแจ้งให้ดาวน์โหลด ... facebook ทำ text / javascript สำหรับโปรโตคอลกราฟดังนั้นมันจะต้องไม่แย่เกินไป)


0

FirePHP เป็นปลั๊กอิน firefox ที่พิมพ์มีคุณสมบัติการบันทึกที่สวยมาก



0

การขยายคำตอบของ @ stephen ได้เพิ่มการปรับแต่งเล็กน้อยเพื่อวัตถุประสงค์ในการแสดงผล

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

จะจัดรูปแบบอาร์เรย์หลายมิติดังนี้:

ใส่คำอธิบายภาพที่นี่



0

ฉันสร้างฟังก์ชันนี้เพื่อพิมพ์อาร์เรย์สำหรับการดีบัก:

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

หวังว่ามันจะช่วยได้ Tziuka S.


0

วิธีการเกี่ยวกับฟังก์ชั่นแบบสแตนด์อโลนเดียวชื่อว่าเป็นการแก้ปัญหาจากhttps://github.com/hazardland/debug.php

ผลลัพธ์ html debug ()ทั่วไปมีลักษณะดังนี้:

ใส่คำอธิบายภาพที่นี่

แต่คุณสามารถส่งออกข้อมูลเป็นข้อความธรรมดาที่มีฟังก์ชั่นเดียวกันได้เช่นกัน (ด้วยแท็บที่เยื้องช่องว่าง 4 ช่อง) เช่นนี้ (และแม้แต่บันทึกในไฟล์หากจำเป็น):

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

ฉันดึงตัวเลือกเหล่านี้มารวมกันเป็นฟังก์ชันผู้ช่วยตัวน้อยที่

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

คุณสามารถพิมพ์เป็น html พิมพ์ออกมาอย่างเรียบร้อยเช่นเดียวกับ jsonify สตริงพิมพ์อัตโนมัติหรือส่งคืนเป็นต้น

จัดการไฟล์รวมถึงวัตถุอาร์เรย์ null และเท็จและสิ่งที่คล้ายกัน

นอกจากนี้ยังมีตัวช่วยที่สามารถเข้าถึงได้ทั่วโลก (แต่มีขอบเขตที่ดี) เมื่อใช้การตั้งค่าในลักษณะที่คล้ายกับสภาพแวดล้อมมากขึ้น

บวกอาร์กิวเมนต์แบบไดนามิกอิงอาร์เรย์หรือสตริง

และฉันยังคงเพิ่มมัน จึงได้รับการสนับสนุน: D


นี่จะเป็นคำตอบที่ดีกว่าหากคุณใส่โค้ดที่แสดงวิธีการใช้งาน
Teepeemm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.