php - 递归函数中的内存泄漏与引用

标签 php recursion memory-leaks

我得到了以下代码。这是一个获取元素和所有 child 的 child 的系统......该元素的 child 。好吧,我使用递归函数来做到这一点:

<?php

header('Content-type: application/json; charset=UTF-8');

require_once 'config.php';

function getItems($parent) {
    global $db;

    $itemsStmt = $db->prepare('SELECT * FROM `items` WHERE `parent_id` = ?');
    $itemsStmt->execute(array($parent));
    return $itemsStmt->fetchAll(PDO::FETCH_ASSOC);
}

function addToArray($items, &$array) {    
    foreach ($items as $item) {
        $child = $item['child_id'];
        $indexer = $item['id'];

        $array[$indexer] = array('children' => array());
        $array[$indexer]['definition'] = $item;

        if ($child)
        {
            addToArray(getItems($child), $array[$indexer]['children']);
        }
    }
}

$array = array();

addToArray(getButtons(1), $array);

echo json_encode($array);

项目表如下所示:

id INT PK AI
title VARCHAR(100) NOT NULL
child_id INT
parent_id INT

child_id 用于 child 的 parent_id(因此如果 child 不存在,您不必使用查询来获取他们)。

现在,它有点管用了。但是如果我添加一个包含以下数据的项目:

NULL
DELETEMELATER
0
2

我收到内存限制错误:

<b>Fatal error</b>:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 42 bytes)

在这条线上:

return $itemsStmt->fetchAll(PDO::FETCH_ASSOC);

最佳答案

我猜你的问题出在你的数据库 structure 和它的 data 以及 parent_idchild_id并且如果将有一行具有相同的 parent_id 和 child_id 你将有递归的无限循环,这就是你出现内存不足异常的原因,你必须修复 db 中的数据或将表结构升级为只有 parent_id并用它控制你的结构

数据库结构案例中的无限循环示例

1) item1父项是item2,item2子项是item1

2) 如果 item2 是 item1 的父级,item1 是 item3 的父级,但 item3 是 item2 的父级

关于php - 递归函数中的内存泄漏与引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34197089/

相关文章:

php - PDO 新手,努力将结果的 id 放入变量中

python - 为什么此代码在第 11 行引发 RecursionError?

ios - 是drawRect----泄漏内存

android - AsyncTaskLoader 中的 "leaking"上下文有那么糟糕吗?

C++。 valgrind 输出 : Syscall param open(filename) points to unaddressable byte(s)

php - 在非常高的图像上用 PHP 绘制线条,然后脚本停止绘制。出了什么问题,我该如何解决?

php base64 图像错误 414(请求 URI 太大)

php - 检查用户是否喜欢页面的无缝方式

list - 在 lisp 中 append 列表

c++ - 删除单链表最后一个元素的递归方法?