Необходимо проверить значения, хранимые в переменных. Это может быть вложенный массив или объект, поэтому нельзя просто распечатать его и пройтись по нему в цикле.
Для этого следует применять функцию print_r() или функцию var_dump():
$array = array("name" => "frank", 12, array(3, 4));
print_r($array);
Array
(
[name] => frank
[0] => 12
[1] => Array
(
[0] => 3
[1] => 4
)
)
var_dump($array);
array(3) {
["name"]=>
string(5) "frank"
[0]=>
int(12)
[1]=>
array(2) {
[0]=>
int(3)
[1]=>
int(4)
}
}
Вывод функции print_r() короче и его легче читать. Однако вывод функции var_dump() содержит типы данных и длину каждой переменной.
Эти функции работают с переменными рекурсивно, поэтому если внутри переменной есть ссылки на саму себя, то в результате можно получить бесконечный цикл. Хотя обе функции сами умеют избегать бесконечного вывода значений переменных. Функция print_r() после первого вхождения переменной печатает слово *RECURSION* вместо дальнейшего вывода информации об этой переменной и продолжает итерацию
для оставшихся данных, которые она должна вывести на печать. Если
функция var_dump() встречает переменную более трех раз, она выдает
фатальную ошибку и заканчивает выполнение сценария.
Рассмотрим
массивы $user_1 и $user_2, ссылающиеся друг на друга посредством
элементов friend:
$user_1 = array('name' => 'Max Bialystock',
'username' => 'max');
$user_2 = array('name' => 'Leo Bloom',
'username' => 'leo');
// Макс и Лео – друзья
$user_2['friend'] = &$user_1;
$user_1['friend'] = &$user_2;
// у Макса и Лео есть работа
$user_1['job'] = 'Swindler';
$user_2['job'] = 'Accountant';
Вывод функции print_r($user_2):
Array
(
[name] => Leo Bloom
[username] => leo
[friend] => Array
(
[name] => Max Bialystock
[username] => max
[friend] => Array
(
[name] => Leo Bloom
[username] => leo
[friend] => Array
*RECURSION*
[job] => Accountant
)
[job] => Swindler
)
[job] => Accountant
)
Встретив ссылку на $user_1 второй раз, функция print_r() печатает
слово *RECURSION* вместо обращения к массиву. Затем она продолжает
свою работу, печатая оставшиеся элементы массивов $user_1 и $user_2.
Встретившись с рекурсией, функция var_dump() ведет себя по-другому:
array(4) {
["name"]=>
string(9) "Leo Bloom"
["username"]=>
string(3) "leo"
["friend"]=>
&array(4) {
["name"]=>
string(14) "Max Bialystock"
["username"]=>
string(3) "max"
["friend"]=>
&array(4) {
["name"]=>
string(9) "Leo Bloom"
["username"]=>
string(3) "leo"
["friend"]=>
&array(4) {
["name"]=>
string(14) "Max Bialystock"
["username"]=>
string(3) "max"
["friend"]=>
&array(4) {
["name"]=>
string(9) "Leo Bloom"
["username"]=>
string(3) "leo"
["friend"]=>
&array(4) {
["name"]=>
string(14) "Max Bialystock"
["username"]=>
string(3) "max"
["friend"]=>
&array(4) {
["name"]=>
string(9) "Leo Bloom"
["username"]=>
string(3) "leo"
["friend"]=>
&array(4) {
<br />
<b>Fatal error</b>: Nesting level too deep recursive dependency? in
<b>var dump.php</b> on line <b>15</b><br />
Функция var_dump() останавливает рекурсию еще до четвертого появления ссылки на массив user_1. Когда это происходит, она выдает фатальную ошибку и прекращает выдачу дампа переменных (или выполнение сценария).
И хотя функции print_r() и var_dump() печатают свои результаты вместо того, чтобы их возвратить, они могут сохранить данные без их распечатки, используя выходной буфер:
ob_start();
var_dump($user);
$dump = ob_get_contents();
ob_end_clean();
Таким образом, результаты функции var_dump($user) помещаются в переменную $dump.
документацию по функции print_r() на http://www.php.net/ print-r и по функции var_dump() на http://www.php.net/var-dump.