2015-03-02 185 views
0

我想動態生成html select options使用PHP的基礎上,無論其存儲在MySQL數據庫。PHP:foreach循環裏面的PHP變量?

存儲名爲sizez的數據的列。

在該列中的數據被存儲,像這樣:

small,large,xlarge,xxlarge 

所以基本上數據由逗號分隔。

現在在我的php頁面我只需將數據拖動到我的頁面上,並使用while loop對存儲在mysql數據庫中的每個產品進行顯示。

我遇到的問題是我需要根據每個項目的sizez列生成選擇選項下拉列表。

因爲我使用的是explode()函數,它也會成功生成選擇選項。

但是,問題是它只會從第一個sizez列中獲取字符串並忽略剩餘的項目。但它也會顯示其他項目的第一列中的字符串,並重復它們!

這是我的代碼:

while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){ 
      $id = $row["id"]; 
      $sizez = $row["sizez"]; 
      $sizez = preg_replace('/\.$/', '', $sizez); //Remove dot at end if exists 
      $array = explode(',', $sizez); //split string into array seperated by ',' 
      foreach($array as $value) //loop over values 
      { 
       //echo $value . PHP_EOL; //print value 
       $sizesOption .='<option>'.$value.'</option>'; 
       } 

$all_list .="<select> 
     '.$sizesOption.' 
     </select>"; 

,所以我認爲把$all_list .=foreach($array as $value)但這種方法是錯誤的。

可能有人請告知這個問題?

任何幫助,將不勝感激。

編輯:

預期的結果應該是這樣的:

item one    item two     item three 
small     large     small 
large     xxlarge     xxlarge 

然而,我的代碼我得到的結果是這樣的:

item one    item two     item three 
small     small     small 
large     large     large 
         small     small 
         large     large 
               small 
               large 

所以基本上,它會得到第一個項目的尺寸列,它會在其他項目的選擇選項內重複它,就像上面的例子。

+0

因此,如果他們重複,預期的結果是什麼?添加一些關於你期望得到的數據。 – Pinx0 2015-03-02 14:59:44

+1

不要在一個字段中存儲多個值(「small,large,xlarge,xxlarge」) - 谷歌關於數據庫的正常形式...... – MilanG 2015-03-02 15:01:06

+0

有一些奇怪的方式你concat字符串。嘗試:'$ all_list。=「」;' – 2015-03-02 15:02:06

回答

2

由於您爲每次迭代生成單獨的<select>,因此您必須重置$sizeOptions。我建議使用數組而不是串接字符串:

$allList = array(); 

while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){ 
    $sizesOption = array(); 
    $sizez = preg_replace('/\.$/', '', $row["sizez"]); 

    $array = explode(',', $sizez); 

    foreach ($array as $value) { 
     $sizesOption[] = "<option>{$value}</option>"; 
    } 

    $all_list[] = '<select>'.implode("\r\n", $sizesOption).'</select>'; 
} 

echo implode("\r\n", $allList); 
+0

謝謝你隊友。你的答案的一部分幫助我解決了這個問題,併發布了我自己的答案。 – TERO 2015-03-02 15:40:01

0

從您發佈的內容看來,您在while循環的每次迭代中都會重新生成$ all_list。

所以,如果你在while循環外面附加$ all_list,它將只有最後一個迭代可用 - 所有其他的迭代在while循環的過程中被覆蓋。

0

也許我錯了。但簡單的:。

$all_list ="<select>".$sizesOption."</select>"; 
+0

這正是我現在正在做的伴侶。 – TERO 2015-03-02 15:10:31

+0

除了一個'。='點。你不是嗎? – Alex 2015-03-02 15:11:11

+0

正確的亞歷克斯。我想我明白了。我會在一分鐘後發佈答案。我只是一個愚蠢的人.. – TERO 2015-03-02 15:20:12

0

關閉開括號爲while循環之前 '$ all_list =「' statement.You的迭代while循環語句

`

while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) 
{ 
      $id = $row["id"]; 
      $sizez = $row["sizez"]; 
      $sizez = preg_replace('/\.$/', '', $sizez); //Remove dot at end if exists 
      $array = explode(',', $sizez); //split string into array seperated by ',' 
      foreach($array as $value) //loop over values 
      { 
       //echo $value . PHP_EOL; //print value 
       $sizesOption .='<option>'.$value.'</option>'; 
       } 
} 
$all_list .="<select> 
     '.$sizesOption.' 
     </select>"; 

`

可能,這將工作

0

我想它了。感謝Justinas的回答。我意識到我必須把我的php變量放在while循環中。

所以我所要做的就是把$sizesOption =array();放在我的while循環中,現在一切正常。

P.S.我還沒有對上面的代碼做過任何其他更改。

+0

我認爲這是錯誤的,因爲在你的情況(使用字符串),你必須使用'$ sizesOption ='';'而不是一個空的數組。 – skroczek 2015-03-02 15:30:00

+0

@skroczek,我同意你的看法,但由於一些奇怪的原因,它可以與'array()'或'=「」;'一起工作。我會把它改成'=「」;'以防萬一。 – TERO 2015-03-02 15:37:36

+0

@TERO PHP是一種奇怪的語言,即使類型不同,也可以重新分配變量。 – Justinas 2015-03-03 06:51:47