Warning: json_encode(): recursion detected in [Directory]
Run Code Online (Sandbox Code Playgroud)
这是什么错误,我似乎无法解决这个问题.每面对500个错误,它会生成一个BIG BIG日志.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];
}
?>
Run Code Online (Sandbox Code Playgroud)
我正在尝试从HTML文件中提取数据,其他提取工作正常,除了上述情况,给出了很多问题.我甚至将这组代码专门分配给一个PHP文件进行处理和同样的问题.
任何的想法?我在主页上使用带有多个函数的jQuery Ajax,$.ajax({
我是Ajax的新手,在一个页面中有多个Ajax可以吗?
lon*_*day 10
问题显然在于你试图调用json_encode
不适合它的东西:
echo json_encode(array("error"=>0,"rmb"=>$retrievermb,"title"=>$retrievetitle));
Run Code Online (Sandbox Code Playgroud)
我们可能会问,是$retrievetitle
什么?它有什么价值?好吧,我们在函数定义中找到它:
$html = str_get_html($htmlcode);
$title = $html->find('div[class=tb-detail-hd]h3');
return $title[0];
Run Code Online (Sandbox Code Playgroud)
很明显它是某种对象.我不熟悉这个simple_html_dom
库,但可能它是一个属于该库并代表HTML元素的对象.也许它是一个本土DOMElement
对象; 我不知道.
然而,很明显,它是某种递归结构.也就是说,在某种意义上它包含自己.这在PHP中是完全可能的,但是不可能用JSON字符串表示.例如,在PHP中:
class Foo {
public $self;
public function __construct() {
$this->self = $this;
}
}
$foo = new Foo;
Run Code Online (Sandbox Code Playgroud)
$foo->self
与...相同的对象$foo
.确实,你可以这样做$foo->self->self->self
,它会工作正常.这是一个非常简单的递归结构.你的可能有点复杂,但原则上并不相同.这不能用JSON表示.json_encode
遇到递归时会出错.
我想你可能想要存储标题的文本内容,而不是标题元素本身.简要阅读该库的API文档,您似乎想要该plaintext
属性.我不太确定这是如何工作的(APi是,我们应该说,稀疏)但我的猜测如下:
return $title[0]->plaintext;
Run Code Online (Sandbox Code Playgroud)
但这只是一个有根据的猜测.
重现问题的简单示例
<?php
$o = new StdClass;
$o->arr = array();
$o->arr[] = $o;
json_encode($o);
Run Code Online (Sandbox Code Playgroud)
一旦 json_encode() 遇到 $o->arr[0]==$o ,它就必须从 $o 重新开始,到达 $o->arr[0],再从 $o 开始,依此类推。为了防止这种情况,该函数“记住”它已经处理过的每个节点。如果它再次“看到”同一节点,则会抛出递归警告。
从函数返回的 simple_html_dom 对象可能引用其父对象或类似的对象,从而导致递归。
所以,也许 return (string)$title[0];
并且return (string)$rmb[0];
将会解决这个问题。
归档时间: |
|
查看次数: |
13648 次 |
最近记录: |