Wyświetl tablicę w czytelnym / hierarchicznym formacie

96

Oto kod do pobierania danych dla mojej tablicy

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

Kiedy używam print_r ($ data), wygląda to tak:

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

Chciałbym to przeczytać jako:

Dziecko naturalne 1
Dziecko
naturalne 2 Dziecko naturalne 3

Xavier
źródło

Odpowiedzi:

31

Spróbuj tego:

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

zamiast print_r($data)

Brian Driscoll
źródło
1
<?php foreach($data[0] as $child) { echo $child . "<br />"; }?> to działało świetnie, dzięki Brian!
Xavier
58
dlaczego, do diabła, jest to wybrana odpowiedź, skoro <pre> </pre> jest oczywistym wyborem?
cantsay
1
To nie zadziała, jeśli masz tablicę wielowymiarową.
Alesana
3
@Alesana Tak, ale OP nie ma wielowymiarowej tablicy. Myślę, że tak jak inni skomentowali tę odpowiedź, sposób, w jaki chcesz iść, jest <pre>print_r($data)</pre>. Zawsze fajnie jest zobaczyć nowy komentarz do odpowiedzi sprzed 5 lat! :)
Brian Driscoll
2
Ach, w moim przypadku pracowałem z wielowymiarową tablicą. Nie zostawiłem wcześniej komentarza, więc kiedy zobaczyłem, że nikt inny nie zwrócił na to uwagi, pomyślałem, że może to być doskonała okazja!
Alesana
429

Zamiast

print_r($data);

próbować

print "<pre>";
print_r($data);
print "</pre>";
Phenex
źródło
3
Warto również wspomnieć, że truejako drugi parametr można przekazać print_r, aby uzyskać dane jako string. Teraz możesz return '<pre>'.print_r(User::all(), true);z pliku tras.
DutGRIFF
Podoba mi się również ta odpowiedź, ale OP chciał tylko wydrukować ciągi znaków, a nie indeksy tablic (wydaje się). I tylko dane jednowymiarowe. Zwykle robię to tylko po to, aby sprawdzić zestaw rekordów danych, zanim przejdę do rozwiązania, więc to rozwiązanie działa o wiele lepiej w przypadku takich rzeczy.
iopener
68
print("<pre>".print_r($data,true)."</pre>");
Shankar ARUL - jupyterdata.com
źródło
1
Jest to idealne rozwiązanie, ponieważ nie dodaje niepotrzebnych białych znaków wokół danych.
nieważność
47

Mam podstawową funkcję:

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

prettyPrint($data);

EDYCJA: zoptymalizowana funkcja

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

EDYCJA: Zoptymalizowana funkcja Moar z obsługą niestandardowych tagów

function prettyPrint($a, $t='pre') {echo "<$t>".print_r($a,1)."</$t>";}
tak samo
źródło
7
Najlepsza jak dotąd odpowiedź, a nawet możesz ją bardziej zoptymalizować, jeśli jest używana bardzo często z przecinkiem:echo '<pre>',print_r($a,1),'</pre>';
Darkendorf
15

Myślę var_export(), że zapomniany brat var_dump()ma najlepsze wyjście - jest bardziej kompaktowy:

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

Przy okazji: nie zawsze jest to konieczne <pre>. var_dump()i var_export()są już sformatowane, gdy spojrzysz na kod źródłowy swojej strony internetowej.

Hexodus
źródło
Zgadzam się z var_export, ale musiałem to połączyć z <pre> </pre>, ponieważ nie wyświetlał wyników w odpowiednim formacie.
Chaya Cooper
3
@ Chaya-Cooper To nie jest poprawnie sformatowane na wyświetlanej stronie, ale myślę, że Hexodus oznaczał, że jest sformatowany "w kodzie źródłowym twojej strony internetowej" -> menu spróbuj "wyświetl źródło" lub Ctrl-U w przeglądarce Firefox
fpierrat
@fpierrat Tak, dokładnie to miałem na myśli. Dziękuję za wyjaśnienie.
Hexodus,
1
Jedną z zalet tego podejścia jest to, że dane wyjściowe są sformatowane jako prawidłowe PHP, więc możesz skopiować / wkleić je z powrotem do swojego kodu, jeśli chcesz.
Sean the Bean
13

jeśli ktoś potrzebuje przeglądać tablice takie fajne;) skorzystaj z tej metody .. to wypisze na konsoli twojej przeglądarki

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

możesz używać w ten sposób ...

console($myObject);

Wynik będzie taki ... super eh !!

wprowadź opis obrazu tutaj

shakee93
źródło
5
foreach($array as $v) echo $v, PHP_EOL;

AKTUALIZACJA : Bardziej wyrafinowanym rozwiązaniem byłoby:

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

To drukuje:

    [
        key1 => val1
        key2 => val2
        key3 => [
            subkey1 => subval1
            subkey2 => subval2
            subkey3 => [
                subsubkey1 => subsubval1
                subsubkey2 => subsubval2
            ]
        ]
    ]
Yaronius
źródło
<? php foreach ($ dane jako $ v) echo $ v, PHP_EOL; ?> wyświetla „Array”
Xavier
1
W takim razie powinieneś powtórzyć dwukrotnie foreach ($ raw jako $ array) foreach ($ array jako $ v) echo $ v, PHP_EOL;
Yaronius
3

print_r()służy głównie do debugowania. Jeśli chcesz wydrukować go w tym formacie, zapętlaj tablicę i wydrukuj elementy.

foreach($data as $d){
  foreach($d as $v){
    echo $v."\n";
  }
}
Rocket Hazmat
źródło
dzięki za odpowiedź, ale wypisuje dane jako „Tablica”
Xavier
@Xavier: Czy wypróbowałeś zaktualizowany kod w mojej odpowiedzi? Musisz przejść przez obie tablice. $datajest tablicą tablic.
Rocket Hazmat,
Twój kod też działał idealnie, właśnie zmieniłem / n na <br />
Xavier
3

To może być prostsze rozwiązanie:

echo implode('<br>', $data[0]);
Projekty beta
źródło
2

Zakładam, że do debugowania używa się print_r. Sugerowałbym wtedy korzystanie z bibliotek takich jak Kint . Pozwala to na wyświetlanie dużych tablic w czytelnym formacie:

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

wprowadź opis obrazu tutaj

zendka
źródło
1
To nie jest zwykłe rozwiązanie PHP, ale zdecydowanie zapewnia użyteczne i czytelne wyjście!
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];
}
?>

Używam tego, aby pokazać odwiedzającym ładnie wydrukowaną tablicę

Trzydzieści osiemdziesiąt
źródło
1

Bardzo fajny sposób na wydrukowanie sformatowanej tablicy w php, używając funkcji var_dump.

 $a = array(1, 2, array("a", "b", "c"));
 var_dump($a);
Muhammad
źródło
1

Używam tego do uzyskiwania kluczy i ich wartości $ qw = mysqli_query ($ connection, $ query);

while ( $ou = mysqli_fetch_array($qw) )
{
    foreach ($ou as $key => $value) 
    {
            echo $key." - ".$value."";
    }
    echo "<br/>";
}
uutsav
źródło
1

Po prostu użyłbym narzędzi online.

Elie GAKUBA
źródło
Właśnie zaktualizowałem to, aby było znacznie bardziej niezawodne, dzięki za link.
phillihp
1

Jedna linijka do szybkiej i łatwej reprezentacji JSON:

    echo json_encode($data, JSON_PRETTY_PRINT);

Jeśli używasz już Composera do projektu, potrzebujesz symfony / yaml i:

    echo Yaml::dump($data);
Iain H.
źródło
0
echo '<pre>';
foreach($data as $entry){
    foreach($entry as $entry2){
        echo $entry2.'<br />';
    }
}
powtac
źródło
0

W przypadku pojedynczych tablic można użyć implodu, co zapewnia czystszy wynik drukowania.

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

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

W przypadku tablic wielowymiarowych musisz połączyć je z jakąś pętlą.

<?php
$msgs[] = $msg;
$msgs[] = $msg;
$msgs[] = $msg;
$msgs[] = $msg;
$msgs[] = $msg;
foreach($msgs as $msg) {
    echo implode('<br />',$msg);
    echo '<br />----------------------<br/>';
}
?>
mjaning
źródło
0

To próbuje poprawić print_r()formatowanie danych wyjściowych w aplikacjach konsolowych:

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

Przykład:

[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
źródło