2012-09-18 50 views
1

我在我的codeigniter应用程序中从数据库中获取数组的视图。 我想根据数组的内容创建多个组合框。如何防止组合框中的重复值

这里的数组是什么样子:

Array ( 
    [0] => Array ( 
        [L1ID] => 2 
        [L1Location] => USA 
        [L2ID] => 3 
        [L2Location] => New York 
        [L3ID] => 4 
        [L3Location] => Manhanttan 
       ) 
    [1] => Array ( 
        [L1ID] => 2 
        [L1Location] => USA 
        [L2ID] => 8 
        [L2Location] => New Jersey 
        [L3ID] => 7 
        [L3Location] => Bergen County 
       ) 

    [2] => Array ( 
        [L1ID] => 5 
        [L1Location] => Canada 
        [L2ID] => 12 
        [L2Location] => Ontario 
        [L3ID] => 50 
        [L3Location] => Toronto 
       ) 
    [3] => Array ( 
        [L1ID] => 6 
        [L1Location] => South Korea 
        [L2ID] => 22 
        [L2Location] => Gyungido 
        [L3ID] => 25 
        [L3Location] => Buchon 
       ) 
    ) 

正如你所看到的,在阵列中的每个项目可以有内定义多达3个位置。 我想创建一个包含所有位置1的组合框。所以,换句话说,它会有“美国”,“加拿大”,“韩国”作为选项。当用户点击任何位置时,我想要查询相同的数组并获得下一级别 - 所有位置2 - 填充到单独的组合框中。 因此,例如,当他们在位置1选择“USA”时,位置2组合将显示“New York”和“New Jersey”作为选项。我已经写了一些代码来开始循环数组并提取所有L1(位置1),但我不知道如何防止添加重复项。

这里是我的代码:

<select id="L1locationlist" name="L1locationlist"> 
     <option value=""></option> 
     <?php 
      foreach ($locations as $location) { 
       echo ($location['L1ID'].'<BR>'); 

       echo '<option value="' . $location['L1ID'] . '">' . $location['L1Location'].'</option>'; 

      } 
     ?> 
    </select> 

我只希望在组合框中一个美国入境。 你能告诉我我该怎么做?我是否必须创建一个单独的函数来检查它是否已经存在于组合框中? 谢谢。

编辑:

最初的计划是从数据库中获取一次的所有位置信息,然后在客户端上,不知何故动态地深入到根据用户点击一下不同的位置。 但我想我也应该问这是否是一个好的设计?如果我只是分别调用数据库,代码可能会更“干净”。例如,我将首先获得所有位置1的值。然后,如果用户选择“美国”,我将再次查询美国的所有sublocations db。 我想最初的想法是保存多次到数据库。 有何评论?

+0

你可以分开国家到另一个阵列,并填写'select'与国家。当用户点击国家时,加载包含位置的数组。 – doktorgradus

+0

点,我建议要么为每组位置做一个单独的查询,要么编写一个'JOIN'语句来获取与此相同格式的所有字段,但仅限于您要使用的信息。 – 0b10011

回答

0

循环遍历$locations数组,并为每个框生成一个新数组,并随时检查值。然后,遍历每个数组并生成框。(Demo.

<?php 
     $countries = array(); 
     $states = array(); 
     $cities = array(); 
     foreach ($locations as $location) { 
      if(!array_key_exists($location['L1ID'], $countries)) 
       $countries[$location['L1ID']] = array(
        'name' => $location['L1Location'], 
        'states' => array(), 
       ); 
      if(!array_key_exists($location['L2ID'], $countries[$location['L1ID']]['states'])){ 
       $countries[$location['L1ID']]['states'][$location['L2ID']] = array(
        'name' => $location['L2Location'], 
        'cities' => array(), 
       ); 
      } 
      if(!array_key_exists($location['L3ID'], $countries[$location['L1ID']]['states'][$location['L2ID']])){ 
       $countries[$location['L1ID']]['states'][$location['L2ID']]['cities'][$location['L3ID']] = $location['L3Location']; 
      } 
     } 

     // Generate $countries box 
     foreach ($countries as $key => $country) { 
      echo ($key.'<BR>'."\n"); 
      echo '<option value="' . $key . '">' . $country['name'].'</option>'."\n"; 

      // Generate $states box 
      foreach ($country['states'] as $key => $state) { 
       echo ($key.'<BR>'."\n"); 
       echo '<option value="' . $key . '">' . $state['name'].'</option>'."\n"; 

       // Generate $city box 
       foreach ($state['cities'] as $key => $city) { 
        echo ($key.'<BR>'."\n"); 
        echo '<option value="' . $key . '">' . $city.'</option>'."\n"; 
       } 

      } 

     } 

    ?> 
+0

请参阅我编辑的评论。谢谢你的代码示例! – dot

+0

@dot - 更新了我的答案。它需要调整一下你的确切用法,但基本上它在每个国家放置一个'states'阵列,并在每个'state'阵列中放置一个'cities'阵列。 – 0b10011

1

我会做的第一件事是分析该阵列把所有的ocations的格式,你想要的:

$parsedLocations = array(1 => array(), 2 => array(), 3 => array()); 
foreach ($locations as $location) { 
    for($i = 1; $i < 4; $i++) { 
     $parsedLocations[i][$location['L' . $i . 'ID']] = $location['L' . $i . 'Location'] 
    } 
} 

一旦你的阵列可以在需要时简单地显示的项目,使他们独特与array_unique()

<select id="L1locationlist" name="L1locationlist"> 
    <option value=""></option> 
    <?php 
    $locations = array_unique($parsedLocations[1]); 
    foreach($locations as $key => $location) { 
     echo ' <option vaue="' . $key . '">' . $location . '</option>'; 
    } 
    ?> 
</select> 

如果要做到这一点动态的所有三个位置,你可以不喜欢以下(具有相同的解析的位置排列):

<?php 
for ($i = 1; $i < 4; $i++) { 
    echo '<select id="L' . $i . 'locationlist" name="L' . $i . 'locationlist">'; 
    echo ' <option value=""></option>'; 
    $locations = array_unique($parsedLocations[1]); 
    foreach($locations as $key => $location) { 
     echo ' <option vaue="' . $key . '">' . $location . '</option>'; 
    } 
    echo '</select>'; 
} 
+0

请参阅我上面的编辑。 – dot

0

试试这个

$i = 1; 
    foreach ($locations as $location) { 
    if(isset($locations[$i-1]['L1Location']) && $locations[$i-1]['L1Location'] != $location['L1Location'] && $i != 1){ 
        echo ($location['L1ID'].'<BR>'); 

        echo '<option value="' . $location['L1ID'] . '">' . $location['L1Location'].'</option>'; 
    $i++; 
    } 

       } 

除此之外它的更好,如果你组通过你的查询L1Location然后不需要像上面的代码简单的foreach循环

+0

我想通过L1Location进行分组,但这并不能给我所有美国的结果。它只给我一个。 – dot

+0

你只想要美国一次吧?然后米糊涂你想达到什么? – webCoder

+0

是的,但是当他们点击美国时,我需要第二个/不同的组合框在美国出现两个子位置。 SQL语句一次返回所有位置。 – dot