2012-09-18 84 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