2010-01-17 149 views
2

我寫了一個簡單的數組,我用它來打印一個html列表選項集,並帶有一個選定的元素。 如果我嘗試在我的頁面中打印多個列表,我的問題開始,因爲只有第一個列表打印正確,爲什麼?爲什麼這個PHP函數調用只能工作一次?

<?php 


$units = array (
'0' => 'Units', 
'kJ' => 'Kilojoule: kJ', 
'g' => 'Grams: g', 
'mg' => 'Milligrams: mg', 
'mcg' => 'Micrograms: mcg, µg'); 

function unit_select_option ($attributes, $code = "") { 
    global $units; 
    $html = "<select title=\"Kilojoule: kJ;&#13;Grammi: g;&#13;Milligrammi: mg;&#13;Microgrammi: mcg, µg;\" $attributes>\r"; 

    while (list($key, $name) = each($units)) { 
     if ($key == "0") { 
      $html .= " <option title=\"$name\" value='$key'>$name</option>\r"; 
     } else if ($key == $code) { 
      $html .= " <option title=\"$name\" selected=\"selected\" value='$key'>$key</option>\r"; 
     } else { 
      $html .= " <option title=\"$name\" value='$key'>$key</option>\r"; 
     } 
    } 
    $html.= "</select>\r"; 
    return $html; 
} 

print unit_select_option ('class="units_select"', "g"); 
print unit_select_option ('class="units_select"', "mg"); 
print unit_select_option ('class="units_select"', "mcg"); 
?> 

該代碼應該不是什麼奇怪的,但我還沒有找到問題,因爲該頁面沒有返回任何錯誤。

html code: 
<select title="Kilojoule: kJ;&#13;Grammi: g;&#13;Milligrammi: mg;&#13;Microgrammi: mcg, µg;" class="units_select"> 
    <option title="Unit&agrave;" value='0'>Unit&agrave;</option> 
    <option title="Kilojoule: kJ" value='kJ'>kJ</option> 
    <option title="Grammi: g" selected="selected" value='g'>g</option> 
    <option title="Milligrammi: mg" value='mg'>mg</option> 
    <option title="Microgrammi: mcg, µg" value='mcg'>mcg</option> 
</select> 
<select title="Kilojoule: kJ;&#13;Grammi: g;&#13;Milligrammi: mg;&#13;Microgrammi: mcg, µg;" class="units_select"> 
</select> 
<select title="Kilojoule: kJ;&#13;Grammi: g;&#13;Milligrammi: mg;&#13;Microgrammi: mcg, µg;" class="units_select"> 
</select> 

回答

2

each()來自:

返回當前鍵和值的對 從數組和推進陣列 光標。

each()後已經執行,陣列 光標將所述陣列的所述下一個 元件上離開,或過去的最後 元件如果它撞擊 陣列的端部。如果要使用每個數組遍歷數組 ,則必須使用reset()

所以:

function unit_select_option ($attributes, $code = "") { 
    global $units; 
    $html = "<select title=\"Kilojoule: kJ;&#13;Grammi: g;&#13;Milligrammi: mg;&#13;Microgrammi: mcg, µg;\" $attributes>\r"; 
    reset($units); 
    while (list($key, $name) = each($units)) { 
    if ($key == "0") { 
     $html .= " <option title=\"$name\" value='$key'>$name</option>\r"; 
    } else if ($key == $code) { 
     $html .= " <option title=\"$name\" selected=\"selected\" value='$key'>$key</option>\r"; 
    } else { 
     $html .= " <option title=\"$name\" value='$key'>$key</option>\r"; 
    } 
    } 
    $html.= "</select>\r"; 
    return $html; 
} 

我傾向於避免each(),因爲它的非重入,這意味着,如果你的循環中調用別的,用它在同一個陣列,它會影響你的外呼叫。不好。你往往會更好只使用一個foreach循環:

function unit_select_option ($attributes, $code = "") { 
    global $units; 
    $html = "<select title=\"Kilojoule: kJ;&#13;Grammi: g;&#13;Milligrammi: mg;&#13;Microgrammi: mcg, µg;\" $attributes>\r"; 
    foreach ($units as $key => $name) { 
    if ($key == "0") { 
     $html .= " <option title=\"$name\" value='$key'>$name</option>\r"; 
    } else if ($key == $code) { 
     $html .= " <option title=\"$name\" selected=\"selected\" value='$key'>$key</option>\r"; 
    } else { 
     $html .= " <option title=\"$name\" value='$key'>$key</option>\r"; 
    } 
    } 
    $html.= "</select>\r"; 
    return $html; 
} 

和你避免所有這些問題。

+0

好的,如果你還給我一個我的代碼的優化版本,你必須得到獎勵,謝謝你的幫助 – vitto 2010-01-17 13:53:52

3

each()推進內部數組遊標。因爲$ units是一個全局變量,所以你第一次調用unit_select_option()會將光標移動到$單位的末尾,並保留給後續調用。

您需要在unit_select_option()的末尾使用reset($units);倒帶您的陣列。

PHP文件:reset

+0

更快的正確答案應該是贏家!那爲什麼我永遠不會贏,或者應該是最清楚的? – vitto 2010-01-17 13:46:26

+0

哦謝謝大家的幫助! – vitto 2010-01-17 13:46:55

1

其他答案應該已經解決了你的問題。

我想補充一點,PHP有foreach結構,所以代替while循環中,您可以只寫

foreach ($unit as $key => $name) { 
    ... 
} 

如果使用foreach你不需要reset()

3

,應重置數組指針:採用復位()

但是你爲什麼不使用foreach循環?

foreach($units as $key => $name){ ... } 

而且不要使用全局,它是邪惡的。在函數體中聲明$ units數組爲static。

+0

+1詛咒 - 你打敗了我。 :-) – 2010-01-17 13:50:13

1

好的,正如其他人所說的問題是因爲你沒有重置全局數組。

但是,我會試圖不使用全局,而是每次都將它傳遞給unit_select_option。 (數組和對象在最近版本的PHP中通過引用傳遞,所以沒有理由不這樣做,它通常被認爲是更好的編程習慣。)

其次,你在while循環中做了一些奇怪的事情 - 我還以爲一個foreach迭代器將使在這種情況下更多的意義,因爲這樣的:

foreach($units as $key => $value) 

只是一個想法。 :-)