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 的组合框。因此,换句话说,它将有“USA”、“CANADA”、“SOUTH KOREA”作为选项。当用户单击任何位置时,我想查询相同的数组并向下一层 - 所有位置 2 的 - 填充在单独的组合框中。例如,当他们在位置 1 中选择“美国”时,位置 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 值。然后,如果用户选择“美国”,我将再次查询数据库以获取美国的所有子位置。我猜最初的想法是保存多次访问数据库。任何意见?

4

3 回答 3

1

我要做的第一件事是解析数组以获取所需格式的所有位置:

$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>';
}
于 2012-09-18T13:38:42.710 回答
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 循环那样编写代码

于 2012-09-18T13:41:42.070 回答
0

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

    <?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";
                }

            }

        }

    ?>
于 2012-09-18T13:35:38.003 回答