print_r со сворачиванием узлов

27.11.2011
@LEXXX_NF

Для своего удобства я написал аналог функции print_r. Сразу покажу, чем она отличается:

Сравнение с выводом функции print_r

И дам ссылку на demo и сам скрипт. Проект переехал на GitHub: https://github.com/alexxxnf/nf_pp/. Так же скрипт можно скачать через Composer.

UPD: добавлена разметка и стиль для корректного отображения пустых массивов и объектов.

UPD: добавлено отображение количества дочерних элементов массива или свойств объекта (число справа от названия ключа массива).

UPD: добавлена возможность сворачивать дочерние массивы массива (клик по количеству дочерних).

UPD: добавлено отображение файла и строки, откуда была вызвана функция.

UPD: теперь параметры в функцию можно передавать не массивом, а поштучно, причём в любом порядке. Подробнее.

Что функция умеет

  • выводить скалярные переменные, массивы, объекты, ресурсы;
  • выделять цветом тип данных;
  • выделять цветом область видимости свойств;
  • явно отображать значения булевых переменных и NULL;
  • выводить тип ресурса;
  • автоматически обрезать длинные строки;
  • выводить массив в виде дерева, с возможностью сворачивания узлов (ради чего всё это было затеяно);
  • выводить дерево в свёрнутом виде или развёрнутым до определённого ключа;
  • отображать файл и строку, откуда была вызвана функция;
  • засекать время, прошедшее между двумя вызовами функции;
  • искать текст в ключах и значениях массивов.

И самое главное

Никаких внешних зависимостей!

Как использовать

Нужно подключить файл nf_pp.php

include 'nf_pp.php';

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

pp( $val );

Опции

Вторым аргументом в функцию можно передать массив параметров.

pp( $val, array( 'trimString' => 0 ) );

Доступны такие опции:

trimString До какой длины обрезать строки. По умолчанию — 1000 символов. 0 — не обрезать совсем.
autoCollapsed Выводить дерево в свёрнутом виде. По умолчанию — FALSE.
autoOpen Массив ключей или один ключ, до которого нужно развернуть дерево. Автоматически включает параметр autoCollapsed.

UPD: мне надоело передавать параметры в функцию массивом и я сделал, чтобы их можно было передавать прямо так, причём в любом порядке. Пример:

pp( $val, 300, 'КириЛлиЦА' );

или

pp( $val, 'КириЛлиЦА', 0 );

или

pp( $val, 'КириЛлиЦА' );

Парамертры определяются по типу. Если передано число, то это — trimString, если булев параметр, то это — autoCollapsed; если строка или массив, то это — autoOpen.

Примеры использования

Просто вывести массив

pp( $val );

demo

Вывести массив в свёрнутом виде

pp( $val, array( 'autoCollapsed' => TRUE ) );

demo

Вывести массив, раскрытый до ключей «c» и «subarray»

pp( $val, array( 'autoOpen' => array( 'c', 'subarray' ) ) );

demo

Вывести массив, раскрытый до ключа «c»

pp( $val, array( 'autoOpen' => array( 'c' ) ) );

или

pp( $val, array( 'autoOpen' => 'c' ) );

demo

Почему не FirePHP

FirePHP — это плагин к Firefox и небольшая библиотечка на PHP, которая позволяет прямо из PHP выводить информацию в консоль Firebug. Все данные пересылаются в заголовках, поэтому внешний вид HTML-страничек не портится и можно нормально отлаживать AJAX.

Так почему же не FirePHP?

  • FirePHP работает только в Firefox.
  • Nginx не даёт пересылать большие заголовки, поэтому нельзя работать с большими массивами (актуально для Битрикса).

Почему не Xdebug

Xdebug — это модуль для PHP, добавляющая в разработку на PHP такие удобства, как точки останова, пошаговое выполнение и наблюдение за выражениями.

Но!

  • Xdebug — это модуль для PHP, который нужно специально устанавливать на сервер.
  • Xdebug существенно замедляет работу сайта, а значит включать его на боевом сервере нельзя.

И еще раз скрипт. Проект переехал на GitHub: https://github.com/alexxxnf/nf_pp/.

#1
Kola
05.12.2011 10:54
Здорово получилось, Алексей. Так и до полноценной кроссбраузерной альтернативы firePHP недолго.
#2
@LEXXX_NF
05.12.2011 11:35
Спасибо!
#3
Scrooge
31.01.2015 21:22
Да, отличная замена FirePHP, тоже сегодня этим вопросом задался, отказываюсь от Firebug и FirePHP + nginx не дает большие массивы дампить в FirePHP, хоть какие буферы выставляй, а на странице хоть сколько выводи, пока браузер не отвалится)))
#4
Алексей
09.09.2016 21:42
Круто!
#5
вася
04.12.2019 00:57
Бро привет, я предал pp($codes, 'Серия');
Но он все равно вывел в развернутом виде весь массив((
Array(98)
[Помещение] => 7599
[Цвет арматуры] => 1992
[Серия] => 1952
[Гарантийный срок] => 1946
[Торговая группа] => 1931
Может, я что то ни так понял? Но все равно спасибо за работу!
#6
@LEXXX_NF
19.01.2020 23:43
Суть в том, что функция разворачивает все родительские объекты или массивы, пока не дойдёт до того, в котором находится нужный ключ. В твоём примере массив как раз содержит нужный ключ, поэтому он вывелся в развёрнутом виде. Чтобы найти нужный ключ в большом, но плоском, массиве лучше использовать поиск.

Писáть здесь