PHP için güzel bir baskı var mı?


110

Bazı PHP betiklerini düzeltirim ve Ruby'nin güzel yazıcısını kaçırıyorum. yani

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

{: one => 1} çıktı verir. Bu, oldukça karmaşık nesnelerle bile çalışır ve bilinmeyen bir komut dosyasını kazmayı çok daha kolay hale getirir. PHP'de bu işlevi tekrarlamanın bir yolu var mı?

Yanıtlar:


101

Her ikisi de print_r()ve var_dump()PHP içindeki nesnelerin görsel temsillerini çıkarır.

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

42
XDebug uzantısını yüklerseniz, var_dump daha da güzel bir yazıcı haline gelir.
Alan Storm

105
Bir tarayıcıda daha da güzel görünmesi için şunu kullanın: echo "<pre>"; print_r ($ dizi); echo "</pre>";
Domenic

13
Domenic'in noktasına sarın: function pr ($ dizi = null) {print "<pre> <code>". print_r ($ dizi). "</ code> </ pre>"; }
Darren Newton

10
@darren_n: print_r() otomatik olarak çıktı verir ve hiçbir şey döndürmez (ikinci parametresi olmadıkça true), bu nedenle başka bir dizgeyle birleştiremezsiniz. Bunun yerine aşağıdakileri kullanın:function pr($var) { print '<pre>'; print_r($var); print '</pre>'; }
Andrew Moore

6
@Domenic Muhtemelen Darren'ın önerisine biraz güvenilirlik katmak yerine `` <pre> ', htmlentities (print_r ($ arr, true)),' </pre> '

158

Dizilerimi yazdırmak için kullandığım şey bu:

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

Sihir preetiketle birlikte gelir .


3
Bu aslında çok daha iyi daha var_dumpçünkü var_dumpsüsler büyük bir dizi ya da büyük bir dize ... eğer sonuç
Radu Murzea

3
basitleştirilmiş bir sürüm şu olacaktır: echo "<pre>". print_r ($ dizi, 1). "</ pre>";
diezsiete

print_r$formatted = print_r($array, true); print "<pre>" . htmlspecialchars($formatted, ENT_QUOTES, 'UTF-8', true) . "</pre>";
Şunların

21

Basit olması için, print_r () ve var_dump () yenilemez. Biraz meraklı bir şey istiyorsanız veya büyük listelerle ve / veya derinlemesine iç içe geçmiş verilerle uğraşıyorsanız , Krumo hayatınızı çok daha kolay hale getirecek - size güzel bir şekilde biçimlendirilmiş daralan / genişleyen bir ekran sağlar.


21

Bulduğum en iyi şey şu:

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

Ve daha ayrıntılı isterseniz:

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

<pre>Bir web geliştirme ortamında bir HTML etiketi \neklemek, bir miktar html eklemek zorunda kalmadan yazdırma işlevinin satırsonlarına doğru bir şekilde saygı gösterecektir.<br>


19

PHP için, iç içe dizilerin ve nesnelerin güzel bir temsilini yapmak için HTML'den ve bazı basit özyinelemeli kodlardan kolayca yararlanabilirsiniz.

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

Bu, diziyi iç içe geçmiş HTML listelerinin bir listesi olarak yazdıracaktır. HTML ve tarayıcınız girintileme ve okunaklı hale getirme ile ilgilenecektir.



6

html_errors = onVar_dump () 'ın xdebug ile birlikte güzelce yazdırılmasını sağlamak için php.ini içinde ayarlamayı unutmayın .


6

Bunu yapmanın en iyi yolu

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

Misal:

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

Sonuç:

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

Print_r hakkında daha fazlasını okuyun .

Dokümantasyondaki ikinci "print_r" parametresi hakkında:

Bu parametre TRUE olarak ayarlandığında, print_r () bilgiyi yazdırmak yerine geri döndürecektir.


Çıktıyı php'den web tarayıcısına göndermek için mükemmel çözüm.
Evhz

4

Bu, dizilerde hata ayıklama yapıyorsanız, her zaman kullandığım küçük bir işlevdir. Title parametresi, yazdırdığınız diziyle ilgili bazı hata ayıklama bilgileri verir. ayrıca ona geçerli bir dizi sağlayıp sağlamadığınızı kontrol eder ve yapmadığınızı bildirir.

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

Temel kullanım:

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

Sonuçlar:

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

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

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

neden olumsuz oy? iyi çalışıyor değil mi? Ağlamayacağım, sadece yanlış bir şey yapıyorsam merak ediyorum. Kendi kendime öğrettim, lütfen beni aydınlatın.
Laurence

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

Windows için sistem günlüğüne veya olay günlüğüne göndermek için



3

Hiç kimsenin print_r komutunuzla "virgül doğru" yapmaktan bahsettiğini görmedim ve sonra bunu, sağlanan tüm çemberlerden veya karmaşık görünümlü çözümlerden geçmeden html ile satır içi olarak KULLANABİLİRSİNİZ.

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

Ek olarak, muhtemelen depolanmış XSS tehditlerine karşı korunmak için htmlspecialchars()etrafta da yapmalısınız print_r().
Christian

2

dizi içeriğini görmeniz için size kabaca "kaynağı görüntüleme" eşdeğerini verecek tek satırlık bir program:

php 4.3.0+ olduğunu varsayar:

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


2

Bu işlev header('Content-type: text/plain');, dönüş dizesini çıktılamadan önce ayarladığınız sürece oldukça iyi çalışır.

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

Herhangi bir PHP değişkeninin (düz metinden ziyade) daha güzel bir temsilini istiyorsanız, nice_r () ; değerleri ve ilgili faydalı bilgileri (örneğin: nesneler için özellikler ve yöntemler) yazdırır. görüntü açıklamasını buraya girin Feragatname: Bunu kendim yazdım.


2

Güzel, renkli bir çıktı:

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

şöyle görünecek:

görüntü açıklamasını buraya girin

kaynak:

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

Bunu google aracılığıyla bulduğumdan beri json'u sorun giderme için daha okunaklı hale getirmek için nasıl biçimlendireceğimi araştırdım.

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

1
bu, print_r ($ json, 1) kullanılarak büyük ölçüde basitleştirilebilir
SorcyCat

1

Sunucunuz, bazıları gönderildikten sonra başlıkları değiştirmenize (düz metne) itiraz ederse veya kodunuzu değiştirmek istemiyorsanız , tarayıcınızdan "kaynağı görüntüleyin" - metin düzenleyiciniz (hatta not defteri) işleyecektir yeni satırlar tarayıcınızdan daha iyi ve karışık bir karmaşaya dönüşecek:

Dizi ([kök] => 1 [alt1] => Dizi () [alt2] => Dizi () [alt3] => Dizi () [alt4] => Dizi () ...

düzgün sekmeli bir gösterime:

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

  [sub2] => Array
      (
      )

  [sub3] => Array
      (
      )

  [sub4] => Array
      (
      )...

1

Sonucu başka işlevlerde kullanmak isterseniz, var_export kullanarak bir dizge olarak geçerli bir PHP ifadesi alabilirsiniz :

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

İnsanların sorularında yaptıkları pek çok şey için, umarım bir işleve adamışlardır ve fazladan günlükleri kopyalayıp yapıştırmazlar. bu durumlarda var_exportbenzer bir çıktı elde eder var_dump.


1

İşte nesnelerin yanı sıra diziler için çalışan bir pp versiyonu (virgülleri de çıkardım):

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

İşte print_r'nin tüm ek yükü olmayan başka bir basit döküm:

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

Bence php'de json yazdırmak için en iyi çözüm başlığı değiştirmektir:

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

(Eğer metin / json yaparsanız, birçok tarayıcı bir indirme isteyecektir ... facebook, grafik protokolleri için text / javascript yapar, bu yüzden çok kötü olmamalıdır)


0

FirePHP, yazdırmanın oldukça hoş bir günlük tutma özelliğine sahip bir firefox eklentisidir.



0

@ Stephen'in cevabını genişletmek, görüntüleme amaçlı birkaç küçük değişiklik ekledi.

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

Herhangi bir çok boyutlu diziyi şu şekilde biçimlendirir:

görüntü açıklamasını buraya girin


0

Genelde kullandığım şey bu:

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

0

Bu işlevi hata ayıklama için bir dizi yazdırmak için yaptım:

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

Umarım yardımcı olur, Tziuka S.


0

Nasıl olarak adlandırılan tek başına işlevi hakkında hata ayıklama gelen https://github.com/hazardland/debug.php .

Tipik debug () html çıktısı şuna benzer:

görüntü açıklamasını buraya girin

Ancak aynı işlevi olan (4 boşluk girintili sekme ile) düz metin olarak veri çıktısını alabilirsiniz (ve hatta gerekirse dosyaya kaydedebilirsiniz):

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

Bu seçeneklerden birkaçını, küçük bir yardımcı işlevi olarak bir araya getirdim.

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

Düzgün bir şekilde çıktı olarak html'ye yazdırabilir, ayrıca dizeyi jsonify edebilir, otomatik yazdırabilir veya geri döndürebilirsiniz.

Dosya içerme, nesneler, diziler, null'lar vs false ve benzerlerini işler.

Ayarları daha çevreye benzer bir şekilde kullanırken, küresel olarak erişilebilir (ancak kapsamlı) bazı yardımcılar da vardır.

Ayrıca dinamik, dizi tabanlı veya dize isteğe bağlı bağımsız değişkenler.

Ve buna eklemeye devam ediyorum. Yani destekleniyor: D


Nasıl kullanıldığını gösteren bir kod eklerseniz bu daha iyi bir cevap olacaktır.
Teepeemm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.