it-swarm-pt.tech

PHP matriz de impressão com uma chave por linha para que seja mais fácil para os olhos?

Como posso imprimir uma matriz, em vez de ser uma única linha, como:

Array ( [0] => Array ( [Palabra] => correr [Tipo] => Verbo ) [1] => Array ( [Palabra] => es [Tipo] => Verbo [PersonaSujeto] => tercera [CantidadSujeto] => singular [Tiempo] => presente ) 

Ele exibe algo mais legível como este ou similar:

Array ( 
    [0] => Array ( 
        [Palabra] => correr
        [1] => Array ( 
             [Tipo] => Verbo 
             [Tiempo] => Infinitivo) )
    [1] => Array ( 
        [Palabra] => es 
        [Tipo] => Verbo 
        [PersonaSujeto] => tercera 
        [CantidadSujeto] => singular 
        [Tiempo] => presente ) 
21
lisovaccaro

Ele é impresso com uma quebra de linha, mas as quebras de linha HTML não têm sentido. Você pode fazer uma das duas coisas:

  1. Diga ao navegador que não é um documento HTML, mas um texto, colocando o seguinte código antes que qualquer saída seja enviada:

    header('Content-type: text/plain');
    
  2. Basta ter tags <pre> ao redor da matriz impressa:

    echo '<pre>'; print_r($array); echo '</pre>';
    
61
Madara Uchiha

Eu amo destacar o código. Este exemplo exibe o array beatificado com código destacado

<?php
$debug_data = array(1,2,5,6,8,7,'aaa');

echo str_replace(array('&lt;?php&nbsp;','?&gt;'), '', highlight_string( '<?php ' .     var_export($debug_data, true) . ' ?>', true ) );
?>

enter image description here

9
FDisk

Se você envolver a saída de funções como print_r, var_dump e var_export em uma tag <pre>, ela será relativamente bem formatada.

A razão é porque a saída das funções é texto simples, mas quando você a visualiza em um navegador, o navegador a considera como HTML. Os novos caracteres de linha na saída de texto não são significativos para HTML, pois novas linhas são ignoradas.

Para ver isso em ação, tente visualizar a fonte - você verá a saída bem formatada lá.

A tag HTML pre diz ao navegador "tudo dentro deste bloco é pre - formatado". Novas linhas são tratadas como novas linhas, o espaçamento é respeitado (o HTML também não se importa com sequências de espaços).

Então, você fica com algo assim:

echo '<pre>'.print_r($my_array).'</pre>';

Ao invés de fazer isso em todo o meu código, eu gosto de usar uma função composta como essa (eu chamo de print_p então é like typing print_r)

function print_p($value = false, $exit = false, $return=false, $recurse=false) {
    if ($return === true && $exit === true)
        $return = false;
    $tab = str_repeat("&nbsp;", 8);
    if ($recurse == false) {
        $recurse = 0;
        $output = '<div style="width:100%; border: 2px dotted red; background-color: #fbffd6; display: block; padding: 4px;">';
        $backtrace = debug_backtrace();
        $output .= '<b>Line: </b>'.$backtrace[0]['line'].'<br>';
        $output .= '<b>File: </b> '.$backtrace[0]['file'].'<br>';
        $indent = "";
    } else {
        $output = '';
        $indent = str_repeat("&nbsp;", $recurse * 8);
    }
    if (is_array($value)) {
        if ($recurse == false) {
            $output .= '<b>Type: </b> Array<br>';
            $output .= "<br>array (<br>";
        } else {
            $output .= "array (<br>";
        }
        $items = array();
        foreach ($value as $k=>$v) {
            if (is_object($v) || is_array($v))
                $items[] = $indent.$tab."'".$k."'=>".print_p($v, false, true, ($recurse+1));
            else
                $items[] = $indent.$tab."'".$k."'=>".($v===null ? "NULL" : "'".$v."'");
        }
        $output .= implode(',<br>', $items);
        if ($recurse == false)
            $output .= '<br>)';
        else
            $output .= '<br>'.$indent.')';
    } elseif (is_object($value)) {
        if ($recurse == false) {
            $output .= '<b>Type: </b> Object<br>';
            $output .= '<br>object ('.get_class($value).'){'."<br>";
        } else {
            $output .= "object (".get_class($value)."){<br>";
        }

        // needed conditional because base class function dump is protected
        $vars = get_object_vars($value);
        $vars = (is_array($vars) == true ? $vars : array());

        $items = array();
        foreach ($vars as $k=>$v) {
            if (is_object($v) || is_array($v))
                $items[] = $indent.$tab."'".$k."'=>".print_p($v, false, true, ($recurse+1));
            else
                $items[] = $indent.$tab."'".$k."'=>".($v===null ? "NULL" : "'".$v."'");
        }
        $output .= implode(',<br>', $items);
        $vars = get_class_methods($value);
        $items = array();
        foreach ($vars as $v) {
            $items[] = $indent.$tab.$tab.$v;
        }
        $output .= '<br>'.$indent.$tab.'<b>Methods</b><br>'.implode(',<br>', $items);
        if ($recurse == false)
            $output .= '<br>}';
        else
            $output .= '<br>'.$indent.'}';
    } else {
        if ($recurse == false) {
            $output .= '<b>Type: </b> '.gettype($value).'<br>';
            $output .= '<b>Value: </b> '.$value;
        } else {
            $output .= '('.gettype($value).') '.$value;
        }
    }
    if ($recurse == false)
        $output .= '</div>';
    if ($return === false)
        echo $output;
    if ($exit === true)
        die();
    return $output;
}

... então você faz isso:

print_p($my_array);

... e obtenha a saída: 

enter image description here

Isso é legal porque a) vai pegar qualquer tipo de variável, objetos, arrays, strings e b) informar de onde a saída está vindo. Pode ficar realmente frustrante se você perder a noção de onde você colocou uma mensagem de depuração e tiver que gastar tempo pesquisando tudo para ela! :)

3
Chris Baker

Este é o melhor amigo de um programador PHP:

function pa($value, $exit = true){
  echo "<pre>";
  print_r($value);
  echo "</pre>";
  if($exit){
    exit();
  }
}

Se você precisa usar assim:

pa($arr);

ou

pa($obj);

Se você não quiser sair

pa($obj, false);
1
Serdar Değirmenci

Todas as respostas acima são boas. Eu gosto de incluir uma função php debug() em minhas funções para que em qualquer lugar no meu aplicativo eu possa apenas chamar debug($my_array); para despejar a matriz para a tela (ou o html), com formatação de legibilidade Nice. Aqui está no github .

É claro que hoje em dia a maioria dos servidores e frameworks tem sua própria versão embutida de algo assim, mas para construir algo do zero isso funciona.

0
joshdutcher
  1. Como outras respostas dizem: Já existem novas linhas e abas na saída print_r. E você pode vê-lo usando <pre> ou como texto simples.

  2. Você pode instalar xdebug para tornar a saída de print_r mais legível

0
RiaD

Adicionar <pre>

Exemplo:

<pre>
<?php
    print_r($array);
?>
<pre>
0
SlavaNov