2015-03-02 56 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