我得到了以下代码.这是一个系统,可以获得物品和孩子们孩子的所有子女….好吧,我使用递归函数来做到这一点:
<?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);
items表看起来像这样:
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);
最佳答案 我猜你的问题在于你的db结构及其数据,以及parent_id和child_id,如果有一行,而且parent_id和child_id是相同的,你将有无限循环的递归,这就是为什么你离开了内存异常,你必须在db或upgrate table strucvcure中修复你的数据,只有parent_id并用它来控制你的结构
db结构案例中的无限循环示例
1)item1 parent是item2,item2 child是item1
2)如果item2是item1的parent,而item1是item3的parent,但item3是item2的parent