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」、「SOUTHKOREA」があります。ユーザーが任意の場所をクリックすると、同じ配列をクエリして、次のレベル(すべての場所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>

コンボボックスにUSAエントリを1つだけ入れたい。どうすればいいのか教えていただけますか?コンボボックスに既に存在するかどうかを確認するために、別の関数を作成する必要がありますか?ありがとうございました。

編集:

当初の計画では、データベースからすべての位置情報を一度取得してから、クライアント側で、ユーザーがクリックした内容に応じて、さまざまな場所に動的にドリルダウンするというものでした。しかし、これが良いデザインかどうかも尋ねるべきだと思います。データベースを個別に呼び出すだけで、コードが「よりクリーン」になる可能性があります。したがって、たとえば、最初はすべてのロケーション1の値を取得します。次に、ユーザーが「USA」を選択した場合、米国内のすべてのサブロケーションについてデータベースに再度クエリを実行します。最初の考えは、データベースへの複数のトリップを保存することだったと思います。コメントはありますか?

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>

3つの場所すべてに対してこれを動的に実行する場合は、次のように実行できます(同じ解析済みの場所の配列を使用)。

<?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

配列をループして、$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 に答える
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 に答える