2015-12-10 2 views
4

У меня есть следующий код. Это система для получения предметов и всех детей детей детей ... предмета. Ну, я использую рекурсивную функцию, чтобы сделать это:Утечка памяти в рекурсивной функции со ссылкой

<?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); 
+0

Ваш первый функция называется 'getItems', когда вы вызываете' getButtons ' – user4035

+0

Извините, забыл изменить его. Но это все еще происходит. –

+0

parent_id принадлежит столбцу 'id' родителя или столбцу' child'? В случае 'id' вам нужно изменить' getButtons ($ child) 'на' getButtons ($ indexer) ' –

ответ

2

я думаю, ваша проблема с вашим db structure и его data, как и у вас, и parent_id и child_id, и если будет строка, у которой есть и parent_id и child_id, которые являются sa у меня будет бесконечный цикл рекурсии, и поэтому вы выбрали исключение из памяти, вы должны исправить свои данные в db или обновить таблицу strucvcure, чтобы иметь только parent_id и управлять своей структурой с ней

Примеры бесконечной петли в вашем дб структуры случае

1) item1 родитель item2 и item2 ребенок iTEM1

2) если item2 является родителем для item1 и item1 является родителем для item3 но item3 является родителем для iTEM2

+0

Да, я понял это. Просто глупая ошибка. –

Смежные вопросы