Dan*_*Lee 6 php mysql recursion children parent
我有这样的表结构
mysql> SELECT id, name, parent_id FROM categories;
+-------+------------+-----------+
| id | name | parent_id |
+-------+------------+-----------+
| 15790 | Test | 0 |
| 15791 | Test2 | 0 |
| 16079 | Subtest | 15790 |
| 16080 | Subtest 2 | 15790 |
| 16081 | Subsubtest | 16079 |
+-------+------------+-----------+
Run Code Online (Sandbox Code Playgroud)
现在我想查找每个孩子和兄弟姐妹的父母,并按照正确的顺序将其删回以便删除.
所以我在这种情况下的输出是:
Array
(
16081,
16080,
16079,
15791,
15790
)
Run Code Online (Sandbox Code Playgroud)
我不能仅仅通过反转父ID来删除,因为这应该是坚实的走回树.
此外,我无法/允许更改表的结构.因此,建立一种索引是必要的.
假设您无权访问TRUNCATE
,SET
(所以您可以这样做SET FOREIGN_KEY_CHECKS=0;
),ALTER
等等,并且绝对必须使用脚本:
由于标记的问题php
,这应该做的伎俩:
function reversetree($src_arr, $currentid = 0)
{
$cats = array();
foreach($src_arr as $id => $parent)
{
if($parent == $currentid)
{
$cats[] = $id;
$cats = array_merge($cats, reversetree($src_arr, $id));
}
}
return !$currentid ? array_reverse($cats) : $cats;
}
$rs = array();
foreach($pdo->query('SELECT id, parent_id FROM categories') as $row)
$rs[$row['id']] = $row['parent_id'];
$stmt = $pdo->prepare('DELETE FROM categories WHERE id = ?');
$pdo->beginTransaction();
foreach(reversetree($rs) as $v)
$stmt->execute(array($v));
$pdo->commit();
Run Code Online (Sandbox Code Playgroud)