2011-04-17 158 views
1

我在php特定论坛中多次提出这个问题,但没有回应。基本上我使用codeigniter和一个名为datamapper的对象关系映射器。当你实例化一个对象时,它将数据库表存储为一个对象,并将这些字段存储为属性。我试图比较两个对象的属性来确定要删除哪些记录。基本上,我有这样的事情:在PHP中嵌套的foreach循环导致在循环中向数组添加项目时出现重复项

http://blog.jeremymartin.name/2008/02/easy-multi-select-transfer-with-jquery.html#

我已经建立了我的add函数成功。但是现在我为编辑功能而苦恼。用户可能想要移除与类别关联的父母或将新父母添加到该类别。所以我需要对此进行解释并相应地更新categories_related_categories连接表。

但是当我尝试到对象属性在foreach循环比较,它遍历内循环两次,复制属性:

public function update(){ 
     $vanity_url = new VanityUrl(); 
     $vanity_url->where('user_id',$this->current_user()->id)->get(); 

     $zones = $this->input->post('zones'); 
     $zone = new Zone(); 
     $zone->where_in('name', $zones)->get(); 

     $subcategory = new Category(); 
     $subcategory->where('id',$this->uri->segment(4))->get(); 

     $old_parents = new Category(); 
     $old_parents = $subcategory->related_category->get(); 

     $unneeded_ids = array(); 

     if(!$this->input->post('catupload')){ 
      if($subcategory->save($zone->all)){ 
       redirect("blogs/$vanity_url->url/categories"); 
      } 
      else { 
       echo "Error occurred. Please try again."; 
      } 
     } 
     else { 
      $new_parents = new Category(); 
      $controller = $this->input->post('catupload'); 
      $new_parents->where_in('controller',$controller)->get(); 

      foreach($new_parents as $new){ 
       foreach($old_parents as $old){ 
        if($new->id != $old->id){ 
         array_push($unneeded_ids, $old->id); 
        } 
       } 
      } 
      $subcategory->delete($subcategory->related_category->where_in('id',$unneeded_ids)->get()); 
if($subcategory->save(array($zone->all,$new_parents->all))){ 
       $this->session->set_flashdata('flash_message', 'The category has been successfully updated.'); 
       redirect("blogs/$vanity_url->url/categories"); 
      } 

     } 
    } 

所以我删除用户通过抓取不再想任何关系不符合用户选择和删除相关记录的ID。

这里的问题:

array(4) { [0]=> int(126) [1]=> int(127) [2]=> int(126) [3]=> int(127) } 

它应该是这样的,而不是因为有没有办法,IDS可以复制:

array(2) {[0]=> int(126) [1]=> int(127)} 

感谢响应。

回答

0

如果你想存储阵列中的独特元素,用它作为关联图:使用元素的键。

也就是说,如果要存储的元素$id(整数)阵列$arr,而不是

array_push($arr, $id ); 

做:

$arr[$id] = $id 

$arr[$id] = 1; // or whatever 

之后,你可能需要array_keys

+0

我没有意识到函数array_push和关联数组之间有一个区别,直到你提到它。 – JohnMerlino 2011-04-17 02:45:23

0

我没有测试它,但你可以使用:

foreach($new_parents as $new){ 
    foreach($old_parents as $old){ 
     if($new->id != $old->id && !in_array($old->id, $unneeded_ids){ 
      array_push($unneeded_ids, $old->id); 
     } 
    } 
} 

..to检查ID在数组中已经上市的?

http://php.net/manual/en/function.in-array.php