Exibir uma matriz em um formato legível / hierárquico

95

Aqui está o código para extrair os dados do meu array

<?php
    $link = mysqli_connect('localhost', 'root', '', 'mutli_page_form');

    $query = "SELECT * FROM wills_children WHERE will=73";

    $result = mysqli_query($link, $query) or die(mysqli_error($link));

    if ($result = mysqli_query($link, $query)) {

    /* fetch associative array */
    if($row = mysqli_fetch_assoc($result)) {
        $data = unserialize($row['children']);
    }

    /* free result set */
    mysqli_free_result($result);
    }
?>

Quando eu uso print_r ($ data), ele lê como:

Array ( [0] => Array ( [0] => Natural Chlid 1 [1] => Natural Chlid 2 [2] => Natural Chlid 3 ) ) 

Eu gostaria que fosse lido como:

Criança Natural 1
Criança
Natural 2 Criança Natural 3

Xavier
fonte

Respostas:

31

Experimente isto:

foreach($data[0] as $child) {
   echo $child . "\n";
}

no lugar de print_r($data)

Brian Driscoll
fonte
1
<?php foreach($data[0] as $child) { echo $child . "<br />"; }?> funcionou muito bem, obrigado Brian!
Xavier,
55
por que diabos esta é a resposta escolhida quando <pre> </pre> é a escolha óbvia?
cantsay
1
Isso não funcionará se você tiver uma matriz multidimensional.
Alesana
3
@Alesana Sim, mas OP não tinha um array multidimensional. Acho que, como outros comentaram sobre esta resposta, o caminho que você deseja seguir é <pre>print_r($data)</pre>. É sempre divertido ver um novo comentário em uma resposta de mais de 5 anos! :)
Brian Driscoll
2
Ah, no meu caso eu estava trabalhando com uma matriz multidimensional. Não deixei nenhum comentário antes, então quando vi que ninguém mais havia me referido, achei que seria uma oportunidade perfeita!
Alesana
423

Ao invés de

print_r($data);

experimentar

print "<pre>";
print_r($data);
print "</pre>";
Phenex
fonte
3
Também vale a pena mencionar que você pode passar truecomo o segundo parâmetro para print_r para obter os dados como string. Agora você pode return '<pre>'.print_r(User::all(), true);usar seu arquivo de rotas.
DutGRIFF
Eu gosto dessa resposta também, mas o OP só queria que as Strings fossem impressas, e não os índices de array (parece que sim). E apenas dados unidimensionais. Normalmente, só faço isso para verificar um conjunto de registros de dados antes de continuar com uma solução, portanto, essa solução funciona muito melhor para coisas como essa.
iopener
64
print("<pre>".print_r($data,true)."</pre>");
Shankar ARUL - jupyterdata.com
fonte
1
Isso é ideal, pois não adiciona espaços em branco desnecessários ao redor dos dados.
nulidade
47

Tenho uma função básica:

function prettyPrint($a) {
    echo "<pre>";
    print_r($a);
    echo "</pre>";
}

prettyPrint($data);

EDIT: função otimizada

function prettyPrint($a) {
    echo '<pre>'.print_r($a,1).'</pre>';
}

EDIT: Função otimizada Moar com suporte de tag personalizada

function prettyPrint($a, $t='pre') {echo "<$t>".print_r($a,1)."</$t>";}
idem
fonte
7
A melhor resposta até agora, e você pode até otimizá-la mais se for usada frequentemente com vírgulas:echo '<pre>',print_r($a,1),'</pre>';
Darkendorf
15

Acho que var_export()o irmão esquecido de var_dump()tem a melhor saída - é mais compacto:

echo "<pre>";
var_export($menue);
echo "</pre>";

A propósito: nem sempre é necessário usar <pre>. var_dump()e var_export()já estão formatados quando você dá uma olhada no código-fonte de sua página da web.

Hexodus
fonte
Eu concordo sobre var_export, mas tive que combiná-lo com <pre> </pre> porque não estava gerando os resultados no formato adequado.
Chaya Cooper
3
@ Chaya-Cooper Não está formatado corretamente na página exibida, mas acho que Hexodus significava que está formatado "no código-fonte de sua página da web" -> tente o menu "ver código-fonte" ou Ctrl-U no Firefox
fpierrat
@fpierrat Sim, é exatamente isso que eu quis dizer. Obrigado por esclarecer isso.
Hexodus
1
Um benefício dessa abordagem é que a saída é formatada como PHP válido, portanto, você pode copiar / colar de volta em seu código, se desejar.
Sean the Bean
13

se alguém precisa ver arrays tão legal;) use este método .. isto irá imprimir no console do seu navegador

function console($obj)
{
    $js = json_encode($obj);
    print_r('<script>console.log('.$js.')</script>');
}

você pode usar assim ..

console($myObject);

A saída vai ser assim .. tão legal eh !!

insira a descrição da imagem aqui

shakee93
fonte
4
foreach($array as $v) echo $v, PHP_EOL;

ATUALIZAÇÃO : Uma solução mais sofisticada seria:

 $test = [
    'key1' => 'val1',
    'key2' => 'val2',
    'key3' => [
        'subkey1' => 'subval1',
        'subkey2' => 'subval2',
        'subkey3' => [
            'subsubkey1' => 'subsubval1',
            'subsubkey2' => 'subsubval2',
        ],
    ],
];
function printArray($arr, $pad = 0, $padStr = "\t") {
    $outerPad = $pad;
    $innerPad = $pad + 1;
    $out = '[' . PHP_EOL;
    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            $out .= str_repeat($padStr, $innerPad) . $k . ' => ' . printArray($v, $innerPad) . PHP_EOL;
        } else {
            $out .= str_repeat($padStr, $innerPad) . $k . ' => ' . $v;
            $out .= PHP_EOL;
        }
    }
    $out .= str_repeat($padStr, $outerPad) . ']';
    return $out;
}

echo printArray($test);

Isso imprime:

    [
        key1 => val1
        key2 => val2
        key3 => [
            subkey1 => subval1
            subkey2 => subval2
            subkey3 => [
                subsubkey1 => subsubval1
                subsubkey2 => subsubval2
            ]
        ]
    ]
Yaronius
fonte
<? php foreach ($ data as $ v) echo $ v, PHP_EOL; ?> exibe "Array"
Xavier,
1
Ok, então você deve iterar duas vezes foreach ($ raw as $ array) foreach ($ array as $ v) echo $ v, PHP_EOL;
Yaronius
3

print_r()é principalmente para depuração. Se você quiser imprimi-lo nesse formato, faça um loop pela matriz e imprima os elementos.

foreach($data as $d){
  foreach($d as $v){
    echo $v."\n";
  }
}
Foguete Hazmat
fonte
obrigado pela resposta, mas imprime os dados como "Array"
Xavier
@Xavier: Você tentou o código atualizado em minha resposta? Você precisa percorrer os dois arrays. $dataé uma matriz de matrizes.
Rocket Hazmat
e seu código funcionou perfeitamente também, eu só mudei o / n para um <br />
Xavier
3

Esta pode ser uma solução mais simples:

echo implode('<br>', $data[0]);
Projetos Beta
fonte
2

Presumo que se use print_r para depuração. Eu sugeriria então o uso de bibliotecas como o Kint . Isso permite exibir grandes arrays em um formato legível:

$data = [['Natural Child 1', 'Natural Child 2', 'Natural Child 3']];
Kint::dump($data, $_SERVER);

insira a descrição da imagem aqui

Zendka
fonte
1
Esta não é uma solução simples de PHP, mas definitivamente fornece uma saída útil e legível!
Sean the Bean
1
<?php 
//Make an array readable as string
function array_read($array, $seperator = ', ', $ending = ' and '){
      $opt = count($array);
      return $opt > 1 ? implode($seperator,array_slice($array,0,$opt-1)).$ending.end($array) : $array[0];
}
?>

Eu uso isso para mostrar uma bela matriz impressa aos meus visitantes

Oitenta
fonte
1

Maneira muito boa de imprimir array formatado em php, usando a função var_dump.

 $a = array(1, 2, array("a", "b", "c"));
 var_dump($a);
Maomé
fonte
1

Eu uso isso para obter chaves e seus valores $ qw = mysqli_query ($ connection, $ query);

while ( $ou = mysqli_fetch_array($qw) )
{
    foreach ($ou as $key => $value) 
    {
            echo $key." - ".$value."";
    }
    echo "<br/>";
}
uutsav
fonte
1

Gostaria apenas de usar ferramentas online.

Elie GAKUBA
fonte
Acabei de atualizar isso para ficar muito mais robusto, obrigado pelo link.
phillihp
1

One-liner para uma representação JSON rápida e fácil:

    echo json_encode($data, JSON_PRETTY_PRINT);

Se já estiver usando o composer para o projeto, exija symfony / yaml e:

    echo Yaml::dump($data);
Iain H.
fonte
0
echo '<pre>';
foreach($data as $entry){
    foreach($entry as $entry2){
        echo $entry2.'<br />';
    }
}
powtac
fonte
0

Para matrizes simples, você pode usar implodir, pois tem um resultado mais limpo para imprimir.

<?php
$msg = array('msg1','msg2','msg3');
echo implode('<br />',$msg);
echo '<br />----------------------<br/>';

echo nl2br(implode("\n",$msg));
echo '<br />----------------------<br/>';
?>

Para matrizes multidimensionais, você precisa combinar com algum tipo de loop.

<?php
$msgs[] = $msg;
$msgs[] = $msg;
$msgs[] = $msg;
$msgs[] = $msg;
$msgs[] = $msg;
foreach($msgs as $msg) {
    echo implode('<br />',$msg);
    echo '<br />----------------------<br/>';
}
?>
Mjaning
fonte
0

Isso tenta melhorar print_r()a formatação de saída em aplicativos de console:

function pretty_printr($array) {

  $string = print_r($array, TRUE);

  foreach (preg_split("/((\r?\n)|(\r\n?))/", $string) as $line) {

    $trimmed_line = trim($line);

    // Skip useless lines.
    if (!$trimmed_line || $trimmed_line === '(' || $trimmed_line === ')' || $trimmed_line === 'Array') {
      continue;
    }

    // Improve lines ending with empty values.
    if (substr_compare($trimmed_line, '=>', -2) === 0) {
      $line .=  "''";
    }

    print $line . PHP_EOL;
  }
}

Exemplo:

[activity_score] => 0
[allow_organisation_contact] => 1
[cover_media] => Array
        [image] => Array
                [url] => ''
        [video] => Array
                [url] => ''
                [oembed_html] => ''
        [thumb] => Array
                [url] => ''
[created_at] => 2019-06-25T09:50:22+02:00
[description] => example description
[state] => published
[fundraiser_type] => anniversary
[end_date] => 2019-09-25
[event] => Array
[goal] => Array
        [cents] => 40000
        [currency] => EUR
[id] => 37798
[your_reference] => ''
Pere
fonte