Отображение массива в читаемом / иерархическом формате

96

Вот код для извлечения данных для моего массива

<?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 />"; }?> это сработало, спасибо Брайану!
Xavier
58
почему, черт возьми, это выбранный ответ, когда <pre> </pre> - очевидный выбор?
cantsay
1
Это не сработает, если у вас есть многомерный массив.
scorgn 06
3
@Alesana Ага, но у OP не было многомерного массива. Я думаю, что, поскольку другие прокомментировали этот ответ, вы хотите пойти по пути <pre>print_r($data)</pre>. Всегда интересно увидеть новый комментарий к ответу 5+ летней давности! :)
Брайан Дрисколл
2
Ах, в моем случае я работал с многомерным массивом. Я не оставлял комментариев раньше, поэтому, когда я увидел, что никто не указал на это, я подумал, что это может быть прекрасная возможность!
scorgn 06
429

Вместо того

print_r($data);

пытаться

print "<pre>";
print_r($data);
print "</pre>";
Фенекс
источник
3
Также стоит упомянуть, что вы можете передать trueв качестве второго параметра print_r, чтобы получить данные как string. Теперь это можно сделать return '<pre>'.print_r(User::all(), true);из файла маршрутов.
DutGRIFF
Мне тоже нравится этот ответ, но OP хотел, чтобы печатались только строки, а не индексы массива (похоже). И только одномерные данные. Обычно я делаю это только для того, чтобы проверить набор данных, прежде чем продолжить работу над решением, поэтому это решение работает лучше для подобных вещей.
iopener
68
print("<pre>".print_r($data,true)."</pre>");
Шанкар АРУЛ - jupyterdata.com
источник
1
Это идеально, так как не добавляет ненужных пробелов вокруг ваших данных.
Обнуление
47

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

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

prettyPrint($data);

РЕДАКТИРОВАТЬ: оптимизированная функция

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

РЕДАКТИРОВАТЬ: оптимизированная функция Moar с поддержкой пользовательских тегов

function prettyPrint($a, $t='pre') {echo "<$t>".print_r($a,1)."</$t>";}
то же самое
источник
7
Лучший ответ на данный момент, и вы даже можете оптимизировать его, если он очень часто используется с запятой:echo '<pre>',print_r($a,1),'</pre>';
Darkendorf
15

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

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

Кстати: использовать его не всегда <pre>. var_dump()и var_export()уже отформатированы, когда вы просматриваете исходный код своей веб-страницы.

Hexodus
источник
Я согласен с var_export, но мне пришлось объединить его с <pre> </pre>, потому что он не выводил результаты в правильном формате.
Chaya Cooper
3
@ Chaya-Cooper Он неправильно отформатирован на отображаемой странице, но я думаю, что Hexodus имел в виду, что он отформатирован «в исходном коде вашей веб-страницы» -> попробуйте меню «просмотреть исходный код» или Ctrl-U в Firefox
fpierrat
@fpierrat Да, я имел в виду именно это. Спасибо, что разъяснили это.
Hexodus
1
Одним из преимуществ этого подхода является то, что выходные данные отформатированы как действительный PHP, поэтому вы можете скопировать / вставить его обратно в свой код, если хотите.
Шон Бин
13

если кому-то нужно так круто просматривать массивы;) используйте этот метод .. это напечатает в консоли вашего браузера

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

можно использовать вот так ..

console($myObject);

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

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

трясти93
источник
5
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; ?> отображает «Массив»
Ксавье
1
Хорошо, тогда вы должны повторить дважды foreach ($ raw как $ array) foreach ($ array as $ v) echo $ v, PHP_EOL;
Yaronius
3

print_r()в основном для отладки. Если вы хотите распечатать его в этом формате, выполните цикл по массиву и распечатайте элементы.

foreach($data as $d){
  foreach($d as $v){
    echo $v."\n";
  }
}
Ракетный Хазмат
источник
спасибо за ответ, но он распечатывает данные как «Массив»
Ксавье
@Xavier: Вы пробовали обновленный код в моем ответе? Вам нужно перебрать оба массива. $dataпредставляет собой массив массивов.
Rocket Hazmat,
и ваш код тоже работал отлично, я просто изменил / n на <br />
Xavier
3

Это может быть более простое решение:

echo implode('<br>', $data[0]);
Бета-проекты
источник
2

Я предполагаю, что для отладки используется print_r. Затем я бы предложил использовать такие библиотеки, как Kint . Это позволяет отображать большие массивы в читаемом формате:

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

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

зендка
источник
1
Это не обычное PHP-решение, но оно определенно обеспечивает полезный и читаемый результат!
Шон Бин
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];
}
?>

Я использую это, чтобы показать посетителям красивый печатный массив

3 восемьдесят
источник
1

Очень хороший способ распечатать форматированный массив на php, используя функцию var_dump.

 $a = array(1, 2, array("a", "b", "c"));
 var_dump($a);
Мухаммад
источник
1

Я использую это для получения ключей и их значений $ qw = mysqli_query ($ connection, $ query);

while ( $ou = mysqli_fetch_array($qw) )
{
    foreach ($ou as $key => $value) 
    {
            echo $key." - ".$value."";
    }
    echo "<br/>";
}
Уутсав
источник
1

Я бы просто использовал онлайн-инструменты.

Эли ГАКУБА
источник
Я только что обновил его, чтобы сделать его более надежным, спасибо за ссылку.
phillihp 09
1

Однострочный для быстрого и легкого представления JSON:

    echo json_encode($data, JSON_PRETTY_PRINT);

Если вы уже используете композитор для проекта, потребуйте symfony / yaml и:

    echo Yaml::dump($data);
Иэн Х.
источник
0
echo '<pre>';
foreach($data as $entry){
    foreach($entry as $entry2){
        echo $entry2.'<br />';
    }
}
Powtac
источник
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/>';
}
?>
Mjaning
источник
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] => ''
Пере
источник