带参考的递归函数中的内存泄漏

时间:2015-12-10 08:37:10

标签: php recursion memory-leaks

我得到了以下代码。这是一个系统,可以获得物品和孩子们孩子的所有子女....好吧,我使用递归函数来做到这一点:

<?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用于子节点的parent_id(因此,如果子节点不存在,则不必使用查询来获取子节点。)

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

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);

1 个答案:

答案 0 :(得分:2)

我猜您的问题与您的数据库structure及其data一样,parent_idchild_id以及是否有一行有和parent_id和child_id是相同的,你将有无限的递归循环,这就是为什么你的内存异常,你必须修复数据在db或upgrate table strucvcure只有parent_id并用它来控制你的结构

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

1)item1 parent是item2,item2 child是item1

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