Вот соглашение. У меня есть "дерево" или "поддерево", в котором я хочу переместиться и удалить каждый элемент. Каждый "узел" может содержать ссылки на другие узлы ниже его (без проблем) ИЛИ может содержать ссылки ВНЕ того конкретного "дерева" / "поддерево". Как я могу создать функцию, которая только удаляет "в" указанном дереве?
Вам нужно использовать 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
Это то же рекурсивное удаление, к которому вы привыкли. Вам просто нужно держать ваши ссылки разделенными - один список для ссылок в дереве, один для ссылок вне дерева. В качестве альтернативы у вас может быть флаг, который отслеживает состояние в дереве / вне дерева для каждой ссылки, но вам нужно будет различать, когда вы создаете ссылку.