我有一个嵌套的类别列表,其中DB看起来像这样:
id parent_id title
83 81 test3
86 83 test1
87 83 test2
94 87 subtest2.1
95 87 subtest2.2
...etc...
我需要将所有子元素id添加到每个父ID的$checked_elements
数组中。
因此,如果选择了某个特定的ID,它会自动添加到$checked_elements
的数组中。这是它的样子:
我坚持使用递归函数,关于如何添加每个父项id的递归子项?我的功能不会比第二级更深入,有人能告诉我如何解决这个问题,以便检查所有子项吗?
private function delete( ){
// Collect all checked elements into the array
$checked_elements = $this->input->post('checked');
// Recursive function to check for child elementts
foreach( $checked_elements as $key => $value ){
// Get records where parent_id is equal to $value (checked item's id)
$childs = $this->categories_model->get_by(array('parent_id' => $value));
// Add found record's id into the array
foreach( $childs as $child ){
$checked_elements[] => $child->id;
}
}
}
答案 0 :(得分:1)
您可以尝试通过引用传递累加器数组:
function collect($ids, &$items) {
foreach($ids as $id){
$items[] = $id;
$childs = $this->categories_model->get_by(array('parent_id' => $id));
collect(array_column($childs, 'id'), $items);
}
return $items;
}
function delete( ){
$items = array();
collect($this->input->post('checked'), $items);
//... delete $items
}
在php 5.5+中,您也可以使用与此类似的方式使用生成器:
function collect($ids) {
foreach($ids as $id) {
yield $id;
$childs = $this->categories_model->get_by(array('parent_id' => $id));
foreach(collect(array_column($childs, 'id')) as $id)
yield $id;
}
function delete( ){
$ids = collect($this->input->post('checked'));
我认为你的树很小,否则我会建议一种更有效的方法,比如嵌套集。
如果您的php版本不支持array_column
,则可以使用this shim。