Mostrar una matriz en un formato legible / jerárquico

96

Aquí está el código para extraer los datos de mi matriz

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

Cuando uso print_r ($ data) se lee como:

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

Me gustaría que se lea como:

Niño natural 1
Niño
natural 2 Niño natural 3

Javier
fuente

Respuestas:

31

Prueba esto:

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

en lugar de print_r($data)

Brian Driscoll
fuente
1
<?php foreach($data[0] as $child) { echo $child . "<br />"; }?> esto funcionó muy bien gracias Brian!
Xavier
55
¿Por qué diablos es esta la respuesta elegida cuando <pre> </pre> es la opción obvia?
cantsay
1
Esto no funcionará si tiene una matriz multidimensional.
Alesana
3
@Alesana Sí, pero OP no tenía una matriz multidimensional. Creo que, como otros han comentado sobre esta respuesta, la forma en que quieres ir es <pre>print_r($data)</pre>. ¡Sin embargo, siempre es divertido ver un nuevo comentario en una respuesta de más de 5 años! :)
Brian Driscoll
2
Ah, en mi caso estaba trabajando con una matriz multidimensional. No había dejado un comentario antes, así que cuando vi que nadie más había señalado esto, pensé que podría ser una oportunidad perfecta.
Alesana
423

En vez de

print_r($data);

tratar

print "<pre>";
print_r($data);
print "</pre>";
Phenex
fuente
3
También vale la pena mencionar que puede pasar truecomo segundo parámetro a print_r para obtener los datos como string. Ahora puede hacerlo return '<pre>'.print_r(User::all(), true);desde su archivo de rutas.
DutGRIFF
También me gusta esta respuesta, pero el OP solo quería que se imprimieran las cadenas, y no los índices de la matriz (parece). Y solo datos unidimensionales. Por lo general, solo hago esto para verificar un conjunto de datos antes de continuar con una solución, por lo que esta solución funciona mucho mejor para cosas como esa.
iopener
66
print("<pre>".print_r($data,true)."</pre>");
Shankar ARUL - jupyterdata.com
fuente
1
Esto es ideal ya que no agrega espacios en blanco innecesarios alrededor de sus datos.
nulabilidad
47

Tengo una función básica:

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

prettyPrint($data);

EDITAR: función optimizada

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

EDITAR: función optimizada de Moar con soporte de etiquetas personalizadas

function prettyPrint($a, $t='pre') {echo "<$t>".print_r($a,1)."</$t>";}
ídem
fuente
7
La mejor respuesta hasta ahora, e incluso puede optimizarla más si se usa con mucha frecuencia con coma:echo '<pre>',print_r($a,1),'</pre>';
Darkendorf
15

Creo que var_export()el hermano olvidado de var_dump()tiene el mejor rendimiento, es más compacto:

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

Por cierto: no siempre es necesario utilizarlo <pre>. var_dump()y var_export()ya están formateados cuando echas un vistazo al código fuente de tu página web.

Hexodus
fuente
Estoy de acuerdo con var_export, pero tuve que combinarlo con <pre> </pre> porque no mostraba los resultados en el formato adecuado.
Chaya Cooper
3
@ Chaya-Cooper No está formateado correctamente en la página mostrada, pero creo que Hexodus quiso decir que está formateado "en el código fuente de su página web" -> pruebe el menú "ver fuente", o Ctrl-U en Firefox
fpierrat
@fpierrat Sí, esto es exactamente lo que quise decir. Gracias por aclarar eso.
Hexodus
1
Un beneficio de este enfoque es que la salida está formateada como PHP válido, por lo que puede copiarlo / pegarlo de nuevo en su código si lo desea.
Sean the Bean
13

si alguien necesita ver matrices tan bien;) use este método .. esto se imprimirá en la consola de su navegador

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

puedes usar así ...

console($myObject);

La salida será así ... tan genial eh !!

ingrese la descripción de la imagen aquí

shakee93
fuente
5
foreach($array as $v) echo $v, PHP_EOL;

ACTUALIZACIÓN : Una solución más sofisticada sería:

 $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);

Esto imprime:

    [
        key1 => val1
        key2 => val2
        key3 => [
            subkey1 => subval1
            subkey2 => subval2
            subkey3 => [
                subsubkey1 => subsubval1
                subsubkey2 => subsubval2
            ]
        ]
    ]
Yaronius
fuente
<? php foreach ($ datos como $ v) echo $ v, PHP_EOL; ?> muestra "Array"
Xavier
1
Bien, entonces debería iterar dos veces foreach ($ raw as $ array) foreach ($ array as $ v) echo $ v, PHP_EOL;
Yaronius
3

print_r()es principalmente para depurar. Si desea imprimirlo en ese formato, recorra la matriz e imprima los elementos.

foreach($data as $d){
  foreach($d as $v){
    echo $v."\n";
  }
}
Cohete Hazmat
fuente
gracias por la respuesta pero imprime los datos como "Array"
Xavier
@Xavier: ¿Probaste el código actualizado en mi respuesta? Necesita recorrer ambas matrices. $dataes una matriz de matrices.
Rocket Hazmat
y su código también funcionó perfectamente, acabo de cambiar la / n a <br />
Xavier
3

Esta puede ser una solución más simple:

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

Supongo que uno usa print_r para depurar. Entonces sugeriría usar bibliotecas como Kint . Esto permite mostrar grandes matrices en un formato legible:

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

ingrese la descripción de la imagen aquí

Zendka
fuente
1
Esta no es una solución PHP básica, ¡pero definitivamente proporciona una salida útil y legible!
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];
}
?>

Utilizo esto para mostrar una bonita matriz impresa a mis visitantes

3 ochenta
fuente
1

Muy buena forma de imprimir una matriz formateada en php, usando la función var_dump.

 $a = array(1, 2, array("a", "b", "c"));
 var_dump($a);
Mahoma
fuente
1

Utilizo esto para obtener claves y sus valores $ qw = mysqli_query ($ conexión, $ consulta);

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

Solo usaría herramientas en línea.

Elie GAKUBA
fuente
Acabo de actualizar esto para que sea mucho más sólido, gracias por el enlace.
phillihp
1

Una línea para una representación JSON rápida y sencilla:

    echo json_encode($data, JSON_PRETTY_PRINT);

Si ya usas el compositor para el proyecto, requiere symfony / yaml y:

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

Para matrices individuales puede usar implosión, tiene un resultado más limpio para imprimir.

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

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

Para matrices multidimensionales, debe combinar con algún tipo de bucle.

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

Esto intenta mejorar print_r()el formato de salida en aplicaciones de consola:

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

Ejemplo:

[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
fuente