Відобразити масив у читаному / ієрархічному форматі


95

Ось код для витягу даних для мого масиву

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

Коли я використовую print_r ($ data), він читається як:

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

Я хотів би, щоб він читав так:

Натуральна дитина 1
Природна дитина 2
Природна дитина 3

Відповіді:


31

Спробуйте це:

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

замість print_r($data)


1
<?php foreach($data[0] as $child) { echo $child . "<br />"; }?> це працювало чудово дякую Брайану!
Ксав'є

55
чому на землі це обрана відповідь, коли <pre> </pre> - очевидний вибір?
cantsay

1
Це не спрацює, якщо у вас є багатовимірний масив.
Алесана

3
@ Алесана Так, але в ОП не було багатовимірного масиву. Я думаю, як інші прокоментували цю відповідь так, як ви хочете піти <pre>print_r($data)</pre>. Завжди весело бачити новий коментар щодо відповіді на 5+ років! :)
Брайан Дрісколл

2
Ах, в моєму випадку я працював з багатовимірним масивом. Я раніше не залишав коментарів, тому коли я не побачив, що ніхто більше не вказав на це, я подумав, що це може бути ідеальною можливістю!
Алесана

423

Замість

print_r($data);

спробуйте

print "<pre>";
print_r($data);
print "</pre>";

3
Також варто згадати, що ви можете передати trueяк другий параметр print_r для отримання даних як string. Тепер ви можете return '<pre>'.print_r(User::all(), true);з файлу маршрутів.
DutGRIFF

Мені подобається ця відповідь, але ОП хотіла лише друкувати рядки, а не індекси масиву (схоже, що). І лише 1-мірні дані. Зазвичай я це роблю лише для перевірки набору даних перед тим, як продовжувати рішення, тому це рішення працює набагато краще для таких матеріалів.
іопенер


47

У мене є основна функція:

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

prettyPrint($data);

EDIT: Оптимізована функція

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

EDIT: Оптимізована функція Moar із підтримкою користувальницьких тегів

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

7
Найкраща відповідь поки що, і ви навіть можете більше її оптимізувати, якщо вона використовується дуже часто з комою:echo '<pre>',print_r($a,1),'</pre>';
Даркендорф

15

Я думаю, що var_export()у забутого брата var_dump()є найкращий результат - він більш компактний:

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

До речі: використовувати це зовсім не обов’язково <pre> . var_dump()і var_export()вони вже відформатовані, коли ви заглянете у вихідний код своєї веб-сторінки.


Я погоджуюся щодо var_export, але мені довелося поєднувати його з <pre> </pre>, оскільки він не виводив результати у належному форматі.
Чая Купер

3
@ Chaya-Cooper Це неправильно відформатовано на відображеній сторінці, але я думаю, що Гексод означав, що він відформатований "у вихідному коді веб-сторінки" -> спробуйте меню "переглянути джерело", або Ctrl-U у Firefox
fpierrat

@fpierrat Так, саме це я мав на увазі. Дякуємо, що уточнили це.
Гексод

1
Однією з переваг такого підходу є те, що вихід форматується як дійсний PHP, щоб ви могли скопіювати / вставити його прямо у свій код, якщо цього хочете.
Шон Бін

13

якщо комусь потрібно переглядати масиви так круто;) скористайтеся цим методом .. це буде надруковано на консолі браузера

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

ви можете використовувати так ..

console($myObject);

Вихід буде такий .. так круто ах !!

введіть тут опис зображення


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

ОНОВЛЕННЯ : Більш складним рішенням буде:

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

Це роздруковує:

    [
        key1 => val1
        key2 => val2
        key3 => [
            subkey1 => subval1
            subkey2 => subval2
            subkey3 => [
                subsubkey1 => subsubval1
                subsubkey2 => subsubval2
            ]
        ]
    ]

<? php foreach ($ data as $ v) echo $ v, PHP_EOL; ?> відображається "масив"
Xavier

1
Гаразд, тоді вам слід повторити два рази foreach ($ raw як $ array) foreach ($ array as $ v) echo $ v, PHP_EOL;
Яроній

3

print_r()в основному для налагодження. Якщо ви хочете роздрукувати його у такому форматі, переведіть його через масив та роздрукуйте елементи.

foreach($data as $d){
  foreach($d as $v){
    echo $v."\n";
  }
}

дякую за відповідь, але він виводить дані як "масив"
Xavier

@Xavier: Ви спробували оновлений код у моїй відповіді? Вам потрібно провести цикл через обидва масиви. $data- це масив масивів.
Ракета Hazmat

і ваш код працював ідеально, я просто змінив / n на <br />
Ксав'є


2

Я припускаю, що для налагодження використовується print_r. Тоді я б запропонував використовувати такі бібліотеки, як Kint . Це дозволяє відображати великі масиви в читаному форматі:

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

введіть тут опис зображення


1
Це не ванільне PHP рішення, але, безумовно, забезпечує корисний і читабельний вихід!
Sean

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

Я використовую це, щоб показати своїм друзям гарний друкований масив


1

Дуже приємний спосіб друкувати відформатований масив у php, використовуючи функцію var_dump.

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

1

Я використовую це для отримання ключів та їх значень $ qw = mysqli_query ($ з'єднання, $ запит);

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


1

Одне вкладиш для швидкого та легкого представлення JSON:

    echo json_encode($data, JSON_PRETTY_PRINT);

Якщо ви вже використовуєте композитор для проекту, вимагайте symfony / yaml та:

    echo Yaml::dump($data);


0

Для одиночних масивів можна використовувати implode, він має більш чистий результат для друку.

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

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

Для багатовимірних масивів потрібно поєднувати якусь петлю.

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

0

Це намагається покращити print_r()форматування виводу в консольних програмах:

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

Приклад:

[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] => ''
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.