2010-06-24 4 views
6

Вот сделка. У меня есть «дерево» или «поддерево», в котором я хочу перемещаться и удалять каждый элемент. Каждый «узел» может содержать ссылки на другие узлы под ним (без проблем) ИЛИ может содержать ссылки ВНЕ этого отдельного «дерева»,/"поддерево". Как создать функцию, которая удаляет только «внутри» указанного дерева?Создание рекурсивной функции удаления (в php)

+3

вы можете указать пример структуры и желаемого результата – Gordon

+0

пахнет домашней работой ... –

+0

Приведите пример своего «дерева» и как должно работать удаление. – salathe

ответ

0

вам нужно RecursiveIterator

+0

Ссылка может быть полезна, но некоторое краткое объяснение сделает ответ более актуальным. – slashingweapon

0

Вы должны использовать realpath():

function DeleteTree($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $path = realpath($path); 
     $files = array_diff(scandir($path), array('.', '..')); 

     foreach ($files as $file) 
     { 
      $file = realpath($path . '/' . $file); 

      // file is within tree 
      if (substr($file, 0, strlen($path)) == $path) 
      { 
       DeleteTree($file); 
      } 
     } 

     return rmdir($path); 
    } 

    else if (is_file($path) === true) 
    { 
     return unlink($path); 
    } 

    return false; 
} 

выше должен делать то, что вы ищете.


Ох ... Я просто понял, что это не может быть связано с файловой системой ... Ошибка - это все! : P

1

Это то же самое рекурсивное удаление, с которым вы привыкли. Вам просто нужно, чтобы ваши ссылки были разделены - один список для ссылок в дереве, один для ссылок из дерева. Кроме того, вы можете иметь флаг, который отслеживает состояние дерева в дереве/вне дерева для каждой ссылки, но при создании ссылки вам придется различать.

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