json_encode дает ошибку рекурсии

Warning: json_encode(): recursion detected in [Directory] 

Что это за ошибка, я не могу решить эту проблему. Он генерирует BIG BIG log за ошибку 500. 133 000 000 байт. Это рассылка журнала до максимальной памяти.

 <?php include('simple_html_dom.php'); if(isset($_REQUEST['type']) && $_REQUEST['type'] = "getmoredetails"){ retrievemore($_REQUEST['htmlsource']); } function retrievemore($htmlcode){ $retrievetitle = retrievechTitle($htmlcode); $retrievermb = retrievechRMB($htmlcode); echo json_encode(array("error"=>0,"rmb"=>$retrievermb,"title"=>$retrievetitle)); } function retrievechTitle($htmlcode){ $html = str_get_html($htmlcode); $title = $html->find('div[class=tb-detail-hd]h3'); return $title[0]; } function retrievechRMB($htmlcode){ $html = str_get_html($htmlcode); $rmb = $html->find('[class=tb-rmb-num]'); return $rmb[0]; } ?> в <?php include('simple_html_dom.php'); if(isset($_REQUEST['type']) && $_REQUEST['type'] = "getmoredetails"){ retrievemore($_REQUEST['htmlsource']); } function retrievemore($htmlcode){ $retrievetitle = retrievechTitle($htmlcode); $retrievermb = retrievechRMB($htmlcode); echo json_encode(array("error"=>0,"rmb"=>$retrievermb,"title"=>$retrievetitle)); } function retrievechTitle($htmlcode){ $html = str_get_html($htmlcode); $title = $html->find('div[class=tb-detail-hd]h3'); return $title[0]; } function retrievechRMB($htmlcode){ $html = str_get_html($htmlcode); $rmb = $html->find('[class=tb-rmb-num]'); return $rmb[0]; } ?> 

Я пытаюсь извлечь данные из файла HTML, другое извлечение работает отлично, за исключением вышеописанного, что дает много проблем. Я даже выделил этот набор кода специально для одного файла PHP для обработки и той же проблемы.

Есть идеи? Я использую jQuery Ajax с несколькими функциями на главной странице с $.ajax({
Я новичок в Ajax, хорошо, что у вас есть несколько Ajax на одной странице?

Проблема заключается в том, что вы пытаетесь вызвать json_encode на то, что не подходит для него:

 echo json_encode(array("error"=>0,"rmb"=>$retrievermb,"title"=>$retrievetitle)); 

Что, мы можем спросить, это $retrievetitle ? Какая это ценность? Ну, мы находим это в определении функции:

 $html = str_get_html($htmlcode); $title = $html->find('div[class=tb-detail-hd]h3'); return $title[0]; 

Так ясно, что это какой-то объект. Я не знаком с библиотекой simple_html_dom , но, предположительно, это объект, который принадлежит этой библиотеке и представляет собой элемент HTML. Возможно, это родной объект DOMElement ; Я не знаю.

Ясно, однако, что это своего рода рекурсивная структура. То есть, в некотором смысле он содержит себя. Это вполне возможно в PHP, но невозможно представить в строке JSON. Например, в PHP:

 class Foo { public $self; public function __construct() { $this->self = $this; } } $foo = new Foo; 

$foo->self – это тот же объект, что и $foo . В самом деле, вы можете сделать $foo->self->self->self и он будет работать нормально. Это очень простая рекурсивная структура. Возможно, вы немного сложнее, но не принципиально. Это невозможно представить в JSON. json_encode будет ошибочно, когда встретится с рекурсией.

Я предполагаю, что вы, вероятно, хотели сохранить текстовое содержимое заголовка, а не сам элемент заголовка. Коротко прочитав документацию API для библиотеки , кажется, вам нужно свойство plaintext . Я не совсем уверен, как это работает (APi, скажем так, разрежен), но я предполагал следующее:

 return $title[0]->plaintext; 

Но это всего лишь образованная догадка.

Простой пример для воссоздания проблемы

 <?php $o = new StdClass; $o->arr = array(); $o->arr[] = $o; json_encode($o); 

Как только json_encode () встретит $ o-> arr [0] == $ o, он должен начать снова с $ o, достигнуть $ o-> arr [0], начать снова с $ o и т. Д. До бесконечности. Чтобы предотвратить это, функция «запоминает» каждый обработанный узел. Если он «видит» тот же узел снова, он выдает предупреждение о рекурсии.
Объекты simple_html_dom, которые вы возвращаете из своих функций, вероятно, ссылаются на их родительские объекты или что-то в этом роде, вызывая рекурсию.
Итак, возможно, return (string)$title[0]; и return (string)$rmb[0]; устранит проблему.

Что вы пытаетесь выполнить, используя метод POST для отправки HTML-источника. Затем разбор его на стороне сервера немного переборщил.

 <?php include('simple_html_dom.php'); if(isset($_REQUEST['type']) && $_REQUEST['type'] = "getmoredetails"){ >> echo $_REQUEST['htmlsource']; >> return; retrievemore($_REQUEST['htmlsource']); } function retrievemore($htmlcode){ $retrievetitle = retrievechTitle($htmlcode); $retrievermb = retrievechRMB($htmlcode); >> gettype($retrievetitle) . ' – ' . gettype($retrievermb); >> return; echo json_encode(array("error"=>0,"rmb"=>$retrievermb,"title"=>$retrievetitle)); } function retrievechTitle($htmlcode){ $html = str_get_html($htmlcode); $title = $html->find('div[class=tb-detail-hd]h3'); return $title[0]; } function retrievechRMB($htmlcode){ $html = str_get_html($htmlcode); $rmb = $html->find('[class=tb-rmb-num]'); return $rmb[0]; } ?> в <?php include('simple_html_dom.php'); if(isset($_REQUEST['type']) && $_REQUEST['type'] = "getmoredetails"){ >> echo $_REQUEST['htmlsource']; >> return; retrievemore($_REQUEST['htmlsource']); } function retrievemore($htmlcode){ $retrievetitle = retrievechTitle($htmlcode); $retrievermb = retrievechRMB($htmlcode); >> gettype($retrievetitle) . ' – ' . gettype($retrievermb); >> return; echo json_encode(array("error"=>0,"rmb"=>$retrievermb,"title"=>$retrievetitle)); } function retrievechTitle($htmlcode){ $html = str_get_html($htmlcode); $title = $html->find('div[class=tb-detail-hd]h3'); return $title[0]; } function retrievechRMB($htmlcode){ $html = str_get_html($htmlcode); $rmb = $html->find('[class=tb-rmb-num]'); return $rmb[0]; } ?> 

Как выглядит ваш вызов AJAX? Вы установили параметр типа "POST"?

 $.ajax({ type: "POST", url: "/echo/json/", data: { name: "John", location: "Boston" } }).done(function(json) console.log(json); }); 

также вы должны попытаться просто вызвать функцию json_encode () самостоятельно. если вы получили сообщение об ошибке.

 echo json_encode(array("error"=>0,"rmb"=>"rmb","title"=>"title")); 

Иногда simple_html_dom.php не будет отбрасываться в строку, как ожидалось. Я решил проблему с помощью синтаксиса строковой строки:

 $HTML_DOM = new simple_html_dom(); $HTML_DOM->load($HTML_Template,true,false); // Preserve line breaks $Content_Box_Data = $HTML_DOM->find('div.Content_Box_Data',0); // find() $Content_Box_Data->innertext = "Some Content"; $HTML_Template = (string)$HTML_DOM;