Функция json_decode у PHP имеет параметр «глубина», где вы можете указать, кто глубоко его рекурсирует. Но следующий код:
test = array( 'name' => 'sean', 'dob' => '12-20', 'parents' => array( 'father' => 'tommy', 'mother' => 'darcy' ) ); foreach(range(1, 3) as $depth) { echo "-----------------\n depth: $depth\n"; print_r(json_decode(json_encode($test), true, $depth)); }
Производит этот вывод:
----------------- depth: 1 ----------------- depth: 2 ----------------- depth: 3 Array ( [name] => sean [dob] => 12-20 [parents] => Array ( [father] => tommy [mother] => darcy ) )
То, что я ожидаю, – это глубина 1, чтобы показать «имя» и «доб», а также глубину 2, чтобы показать родителям. Я не понимаю, почему глубина 1 или 2 ничего не отображает.
Может ли кто-нибудь объяснить мне, что я не понимаю?
В документации говорится, почему.
NULL возвращается, если json не может быть декодирован или если кодированные данные глубже, чем предел рекурсии .
проблема в том, что вы не поняли параметр depth
правильно
глубина test
массива равна 3, и поэтому он не будет напечатан в первых двух итерациях и возвращается значение null
но на третьей итерации он печатается, потому что его глубина равна $depth
[т.е. 3]
В дополнение к ответам @Explosion Pills вы ожидаете, что json_decode
будет работать как json_encode
.
Согласно документации вы можете указать свой лимит, чтобы закодировать массивы / объекты. Это просто означает, что он будет пропускать глубже указанного уровня.
Для json_decode
это другое – он всегда пытается разобрать целую строку JSON, потому что она просто не может остановиться и пропустить более глубокие части без разбора всей строки. Вот почему предел глубины заставляет функцию возвращать NULL в этом случае.
json_encode
может останавливаться и пропускать более глубокие части, поскольку структура данных уже определена в памяти.
Обратите внимание, что для PHP версии 5.5.0 добавлена $depth
для json_encode
(с json_decode
с 5.3.0). Проверьте журнал изменений здесь .