PHP массив печати с одним ключом на строку, чтобы это было проще на глазах?
Как я могу напечатать массив, чтобы вместо одной строки, например:
Array ( [0] => Array ( [Palabra] => correr [Tipo] => Verbo ) [1] => Array ( [Palabra] => es [Tipo] => Verbo [PersonaSujeto] => tercera [CantidadSujeto] => singular [Tiempo] => presente )
Отображает что-то более читаемое, подобное этому или тому подобное:
Array (
[0] => Array (
[Palabra] => correr
[1] => Array (
[Tipo] => Verbo
[Tiempo] => Infinitivo) )
[1] => Array (
[Palabra] => es
[Tipo] => Verbo
[PersonaSujeto] => tercera
[CantidadSujeto] => singular
[Tiempo] => presente )
Ответы
Ответ 1
Он распечатывается с разрывом строки, но в HTML разрывы строк не имеют смысла. Вы можете сделать одну из двух вещей:
-
Сообщите браузеру не HTML-документ, а текст, поместив следующий код перед отправкой любого результата:
header('Content-type: text/plain');
-
Для печатного массива просто есть теги <pre>
:
echo '<pre>'; print_r($array); echo '</pre>';
Ответ 2
Мне нравится подсветка кода. В этом примере отображается бешеный массив с выделенным кодом
<?php
$debug_data = array(1,2,5,6,8,7,'aaa');
echo str_replace(array('<?php ','?>'), '', highlight_string( '<?php ' . var_export($debug_data, true) . ' ?>', true ) );
?>
![enter image description here]()
Ответ 3
Если вы завершите вывод таких функций, как print_r
, var_dump
и var_export
в теге <pre>
, он будет относительно красиво отформатирован.
Причина в том, что вывод функций - это простой текст, но когда вы смотрите на него в браузере, браузер считает его HTML. Новые символы строки в выводе открытого текста не имеют смысла для HTML, поскольку новые строки игнорируются.
Чтобы увидеть это в действии, попробуйте просмотреть источник - вы увидите там хорошо отформатированный вывод.
Тег pre
HTML указывает браузеру "все внутри этого блока pre -formated". Новые строки рассматриваются как новые строки, соблюдение интервала (HTML тоже не заботится о последовательностях пробелов).
Итак, у вас осталось что-то вроде этого:
echo '<pre>'.print_r($my_array).'</pre>';
Вместо того, чтобы делать это по всему моему коду, мне нравится использовать составную функцию, подобную этой (я называю ее print_p
, так что это похоже на ввод print_r
)
function print_p($value = false, $exit = false, $return=false, $recurse=false) {
if ($return === true && $exit === true)
$return = false;
$tab = str_repeat(" ", 8);
if ($recurse == false) {
$recurse = 0;
$output = '<div style="width:100%; border: 2px dotted red; background-color: #fbffd6; display: block; padding: 4px;">';
$backtrace = debug_backtrace();
$output .= '<b>Line: </b>'.$backtrace[0]['line'].'<br>';
$output .= '<b>File: </b> '.$backtrace[0]['file'].'<br>';
$indent = "";
} else {
$output = '';
$indent = str_repeat(" ", $recurse * 8);
}
if (is_array($value)) {
if ($recurse == false) {
$output .= '<b>Type: </b> Array<br>';
$output .= "<br>array (<br>";
} else {
$output .= "array (<br>";
}
$items = array();
foreach ($value as $k=>$v) {
if (is_object($v) || is_array($v))
$items[] = $indent.$tab."'".$k."'=>".print_p($v, false, true, ($recurse+1));
else
$items[] = $indent.$tab."'".$k."'=>".($v===null ? "NULL" : "'".$v."'");
}
$output .= implode(',<br>', $items);
if ($recurse == false)
$output .= '<br>)';
else
$output .= '<br>'.$indent.')';
} elseif (is_object($value)) {
if ($recurse == false) {
$output .= '<b>Type: </b> Object<br>';
$output .= '<br>object ('.get_class($value).'){'."<br>";
} else {
$output .= "object (".get_class($value)."){<br>";
}
// needed conditional because base class function dump is protected
$vars = get_object_vars($value);
$vars = (is_array($vars) == true ? $vars : array());
$items = array();
foreach ($vars as $k=>$v) {
if (is_object($v) || is_array($v))
$items[] = $indent.$tab."'".$k."'=>".print_p($v, false, true, ($recurse+1));
else
$items[] = $indent.$tab."'".$k."'=>".($v===null ? "NULL" : "'".$v."'");
}
$output .= implode(',<br>', $items);
$vars = get_class_methods($value);
$items = array();
foreach ($vars as $v) {
$items[] = $indent.$tab.$tab.$v;
}
$output .= '<br>'.$indent.$tab.'<b>Methods</b><br>'.implode(',<br>', $items);
if ($recurse == false)
$output .= '<br>}';
else
$output .= '<br>'.$indent.'}';
} else {
if ($recurse == false) {
$output .= '<b>Type: </b> '.gettype($value).'<br>';
$output .= '<b>Value: </b> '.$value;
} else {
$output .= '('.gettype($value).') '.$value;
}
}
if ($recurse == false)
$output .= '</div>';
if ($return === false)
echo $output;
if ($exit === true)
die();
return $output;
}
... тогда вы это сделаете:
print_p($my_array);
... и получить результат:
![enter image description here]()
Это хорошо, потому что он: а) принимает любой тип переменной, объекты, массивы, строки и б) сообщает вам, откуда идет выход. Это может стать действительно разочаровывающим, если вы потеряете информацию о том, куда вы отправили сообщение отладки, и вам придется тратить время на все это!:)
Ответ 4
Это лучший друг программиста PHP:
function pa($value, $exit = true){
echo "<pre>";
print_r($value);
echo "</pre>";
if($exit){
exit();
}
}
Если вам нужно использовать вот так:
pa($arr);
или
pa($obj);
Если вы не хотите выйти из
pa($obj, false);
Ответ 5
Добавить <pre>
Пример:
<pre>
<?php
print_r($array);
?>
<pre>
Ответ 6
-
Как говорят другие ответы: в выводе print_r
уже есть новые строки и вкладки. И вы можете увидеть это с помощью <pre>
или увидеть как обычный текст.
-
Вы можете установить xdebug
, чтобы сделать вывод print_r
более удобочитаемым
Ответ 7
Все вышеприведенные ответы хороши. Мне нравится включать функцию debug()
php в мои функции, поэтому в любом месте моего приложения я могу просто позвонить debug($my_array);
, чтобы выгрузить массив на экран (или html), с некоторым хорошим форматированием удобочитаемости. Здесь он находится на github.
Конечно, в наши дни большинство серверов и фреймворков имеют собственную встроенную версию чего-то подобного, но для создания чего-то с нуля это работает.