-1

在 CodeIgniter 中,我正在尝试创建一个函数。需要创建将删除数据库中的行的数组,例如:

$selected_items_by_id = array('1','2','3','4',);   // --<<<Need Create This
$this->db->where_in('id', $selected_items_by_id);
$this->db->delete('mytable');

mytabe数据库结构

ID | NAME         | PARENT_ID
1   Item1              0     // First Root item
2   Item2              1     // First Root sub item
3   Item3              2     // First Root sub sub item
4   Item4              3     // First Root sub sub sub item
5   Item5              0     // Second Root item

物品布局:

Item1
+Item2
++Item3
+++Item4
Item5

在这里,我得到了所需的项目 ID(来自选择框):

$id = $this->input->post('delete_menu_item');

逻辑:

  1. 如果 item parent_id == 0,则 item 是 root。
  2. 如果 Item 是根项,则数组中将只有根项 id
  3. 在数组中需要 $id 和所有 $id 子(如果它们存在)

更新 我尝试在 CI 之外创建递归函数。

搜索功能 - 分离必要的子阵列:

 function search($array, $key, $value)
{
    $results = array();

    if (is_array($array))
    {
        if (isset($array[$key]) && $array[$key] == $value)
            $results[] = $array;

        foreach ($array as $subarray)
            $results = array_merge($results, search($subarray, $key, $value));
    }

    return $results;
}

我正在使用这个数组,基于 DB 条目:

$array = array(
array('id' => '1', 'name' => 'Item1', 'parent_id' => '0'),
array('id' => '2', 'name' => 'Item2', 'parent_id' => '1'),
array('id' => '3', 'name' => 'Item3', 'parent_id' => '2'),
array('id' => '4', 'name' => 'Item4', 'parent_id' => '3'),
array('id' => '5', 'name' => 'Item5', 'parent_id' => '0'),
);

递归函数:

function build_array($array,$id, $final = NULL){


   $data = search($array, 'id', $id);

   foreach ($data as $item):
       if ($item['parent_id'] == 0){

           $final[] = $item['id'];


       }
       else {    
           $parent_id = $item['parent_id'];
           $final[] = $item['id'];
           $final[] = $parent_id;

          build_array($array, $parent_id, $final); 
           // Here go recursive
       }    
   endforeach;


        return $final;
}


$result = build_array($array,1);
var_dump($result);

递归函数应该是什么?

4

3 回答 3

2

如果我理解您的要求,您将需要迭代地处理每个项目(在循环中)。

所以首先你得到一个项目,然后你看看它是否有一个父项——如果有,得到它的父项并重新开始,等等。这是递归函数真正派上用场的少数情况之一。

您只是在进行过程中构建最终的数组,直到项目用完 - 请注意,如果您不小心,当您一遍又一遍地提取相同的项目时,您将获得无限循环。

如果没有更多关于你必须输入什么以及你想得到什么作为输出的信息,这对任何人都有帮助。如需更多帮助,您需要澄清您想要输出的内容、到目前为止您尝试过的代码以及您不想要的内容等。

于 2013-10-13T18:29:52.737 回答
1

行。我将使用您放在一起的示例数组,只是略有不同:由于ids 是唯一的,因此没有理由不将它们用作键。像这样:

$array = array(
  '1'=>array('name' => 'Item1', 'parent_id' => '0'),
  '2'=>array('name' => 'Item2', 'parent_id' => '1'),
  '3'=>array('name' => 'Item3', 'parent_id' => '2'),
  '4'=>array('name' => 'Item4', 'parent_id' => '3'),
  '5'=>array('name' => 'Item5', 'parent_id' => '0'),
  );

将以下方法添加到您的控制器/模型/lib/whatever:

function children_of($arr,$id)
  {
  $r=array();
  foreach($arr as $key=>$entry)
    if($entry['parent_id']==$id) $r[]=$key;
  return $r;
  }

function subtree_array($arr,$id)
  {
  if(isset($arr[$id]))
    {
    $r=array($id);
    foreach($this->children_of($arr,$id) as $child)
      $r=array_merge($r,$this->subtree_array($arr,$child));
    return $r;
    }
  else
    return array(0); // (0) comes handy in SQL IN operations
  }

children_of()返回in的直接子级。$id$arr

subtree_array()返回一个数组,包括$id它的所有后代$arr。如果$id不是 的键$arr,则返回array(0)。那是因为您说您想在 SQL 查询中使用它,并且where像这样的子句where xyz in ()将是伪造的,而where xyz in (0)不会是伪造的,并且总是会返回false,因为没有项目为零id(它似乎被保留以表示根节点)。

因此,用法可能类似于:

$id=$this->input->post('delete_menu_item');
$selected_items_by_id=subtree_array($aray,$id);
于 2013-10-25T08:09:06.377 回答
-2

我试图从另一边接近任务。使用级联删除,一切都在 sql 方面:

 CREATE TABLE `navigation` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NOT NULL COLLATE 'utf8_general_ci',
    `url` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
    `position` MEDIUMINT(8) NOT NULL DEFAULT '100',
    `parent_id` INT(11) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `parent_id` (`parent_id`),
    CONSTRAINT `FK1` FOREIGN KEY (`parent_id`) REFERENCES `navigation` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;

谢谢你的建议。

于 2013-10-25T12:04:26.450 回答