如何防止组合框中的重复值

时间:2012-09-18 13:30:26

标签: php

我的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个位置。 我想创建一个包含所有Location 1的组合框。 换句话说,它将有“美国”,“加拿大”,“韩国”作为选项。当用户点击任何位置时,我想查询同一个阵列并获得下一级别 - 所有位置2 - 填充在单独的组合框中。 因此,例如,当他们在位置1中选择“USA”时,位置2组合将显示“纽约”和“新泽西”作为选项。

我已经编写了一些代码来开始循环遍历数组并提取所有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的值。然后,如果用户选择“USA”,我将再次查询db以查看美国的所有子位置。 我想最初的想法是保存多次前往数据库。 任何意见?

3 个答案:

答案 0 :(得分: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>';
}

答案 1 :(得分: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";
                }

            }

        }

    ?>

答案 2 :(得分: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循环那样进行编码