2011-09-20 79 views
0

我试图在数据库中存储一堆功能。我在想的格式是将其插入这样的:PHP将长字符串分隔成列表

的东西在这里|分隔由|更多的东西|还有一些更

现在,我需要抓住从数据库中,并使其进入像这样的列表:

<ul> 
    <li>Stuff Here</li> 
    <li>Separated By That</li> 
    <li>More Stuff</li> 
    <li>And some more</li> 
</ul> 

这会很容易吗?我知道我可以这样做:

str_replace("|", "<li>", $data); 

但是,那么这将不适用于第一个项目和最后一个项目,再加上结束标记。有没有更进一步的方式,我应该将我的列表插入数据库?或者这种方式很好,我只需要正确的代码来更好地格式化无序列表?

+0

以这种格式存储数据通常是一个坏主意。您希望每个项目在数据库中都有它自己的行。查看“正常化”以获得更多关于这个想法的信息。 – mfonda

回答

5

我不认为有一行代码可以用来做到这一点(很想纠正),所以是的,将数据存储为当前在数据库中,并编写一个小的帮助函数分割字符串并构建HTML列表。

function build_list($string) { 
    $output = '<ul>'; 
    $items = explode('|', $string); 
    foreach ($items as $item) { 
    $output .= '<li>' . $item . '</li>'; 
    } 
    $output .= '</ul>'; 

    return $output; 
} 
+0

我同意克莱夫,我不相信会有一行代码 - 只是因为你必须包括第一个和最后一个项目,如你所说。克莱夫得到了正确的想法海事组织。这里有一个小帮手功能。 – Hanny

+2

这是我认为最好的方法。如果用于导航或类似的东西,那么您将不可避免地为li标签添加属性,而'聪明'的str_replace解决方案不再有用。 –

+0

完美!谢谢。除非我在最后得到一个空白的子弹。 – Drew

1

使用explode()将您的字符串拆分为数组。然后,你可以使用foreach循环来生成你的列表。

2

如果你想保持简单的存储方法,你可以注入在同一时间开始和结束标记:

str_replace("|", "</li><li>", "<li>$data</li>"); 

您还应该测试,然后如果有至少一个$data条目。

2

使用“由某事物分隔”的方法几乎总是一种不好的方法。规范化的DATABSE让你有每个功能行,像

table features(
    id PK, 
    Name 
) 

,一切都变得更加容易查询/维持...

2

我使用的是VIN解码器,一旦解码VIN它给了我一个巨大的 不同类别的功能列表,如外部,内部, 安全,机械。它为我生成,但用户将有 选项来删除和编辑它们。如果我将 插入到自己的表中(如果它不存在,然后尝试 与车辆匹配),它可能会变得非常混乱。

这是关系数据库工作得很好的情况。你会想创建几个表来处理这个问题。

  • VIN与功能之间有一个one to many关系。

这表明您将拥有一张储存不同可能功能的表格。

table features (
    featureID, 
    category, 
    feature 
) 

然后,您可以有关联与功能VIN号码表:

table vin_features (
    VIN, 
    featureID 
) 

您可能还具有特定于每个VIN信息(也许制造商,型号,年份?)的表,也许用户选项表。

从长远来看,这使得您的数据管理和查询变得更容易,特别是如果您开始必须回答更复杂的问题。

+0

因此,当插入新的VIN时,如果不存在,则自动插入到要素表中。然后,将车辆的默认功能从vin解码器插入到vin_features表中。那么如果其中一个更新了自定义,我需要将其添加到功能表中? – Drew

+0

如果有人输入了一个没有人会输入的虚假特征,它是否仍然需要存储在特征表中? – Drew

相关问题