2012-08-27 114 views
0

我想通过所有结果循环,然后检查从数据库中选择(2表)。现在它显示所有结果并检查正确的结果,但我的结果是重复的。我能做些什么来解决这个问题?PHP foreach循环通过复选框

什么IM现在越来越

x item1 
item1 
item1 
item2 
x item2 
item2 
item3 
item3 
x item3 
etc... 

结果我想用

x item1 
x item2 
x item3 
item4 
item5 
x item6 
etc 

代码IM(使用笨林)

<? foreach($modules as $key => $module): ?> 
    <? foreach($selectedmodules as $key => $selected):?> 
     <input type="checkbox" name="" value="<?=$module->module_id?>" 
     <?=($selected->module_sel_id == $module->module_id ? 'checked="checked"' : '') ?>/><?=$module->module_name?><br /> 
    <? endforeach; ?> 
<? endforeach; ?> 

型号

public function getModules() 
{ 
    $this->db->select('*'); 
    $this->db->from('module_type a'); 
    $this->db->join('module b', 'a.type_id = b.type_id'); 

    return $this->db->get()->result(); 
} 

public function getSelectedModules($id) 
{ 
    $this->db->select('b.module_sel_id'); 
    $this->db->from('module a'); 
    $this->db->join('module_select b', 'a.module_id = b.module_sel_id'); 
    $this->db->where('b.product_id', $id); 

    return $this->db->get()->result(); 
} 
+0

有什么破? – Ibu

+2

为什么你放两个循环?您编写的代码不足以诊断问题 – WatsMyName

+1

请解释“重复结果”部分。然后显示数据库中的数据示例,最后显示查询本身。 –

回答

1

这里有一个版本,将工作,但它的不是最好的方式,你一定要考虑找到一种方法来避免内部循环。测试看看是否应该检查。

<? foreach($modules as $key => $module): ?> 
    <? $checked = false; ?> 
    <? foreach($selectedmodules as $key => $selected):?> 
     <? if($selected->module_sel_id == $module->module_id) $checked = true; ?> 
    <? endforeach; ?> 
    <input type="checkbox" name="" value="<?=$module->module_id?>" 
    <?=($checked ? 'checked="checked"' : '') ?>/><?=$module->module_name?><br /> 
<? endforeach; ?> 

当前方法是通过所有复选框循环,然后所有选定复选框。 最好的的方式是循环所有复选框,然后测试是否应该检查它。这里有一些伪代码:

<? foreach($modules as $key => $module): ?> 
    <input type="checkbox" name="" value="<?=$module->module_id?>" 
    <?=(in_array($module>module_id, $selectedmodules) ? 'checked="checked"' : '') ?>/><?=$module->module_name?><br /> 
<? endforeach; ?> 
+0

你是关于你的第一个版本,工作。我试着第二个,in_array去工作,如果我使用对象? – dynamo

+1

@dynamo,看看你刚刚发布的代码,我认为最好是结合你的查询(如果可能的话,我不熟悉CodeIgniter),所以你在第一个循环中有可用的信息。另外,出于性能方面的原因,当您只需要几个表时,最好不要使用通配符“*”来选择表中的列。这会导致服务器必须返回所有列的**,而不仅仅是您需要的列。 – 0b10011

+0

是的我意识到通配符我通常只是这样做,直到我弄清楚我需要什么。我也知道人们讨厌php速记。所以基本上我应该尝试做一个子查询来获得选择的选项? – dynamo