简而言之,问题,
Field:ProfileItems = "action,Search,Work,Flow,pictures";
Mysql query = "SELECT ProfileItems FROM addUsers";
然后我explode
,
制作数组,例如:array('action','search',...etc)
并创建用于,
的字段
结果:
<form>
action : <input type=text name=action>
search : <input type=text name=search>
...etc
<input type=submit>
</form>
我的问题是如何在不使用 IF
语句的情况下用更用户友好的名称(添加描述)替换数据库中的名称?
//created asoc array with Key = search item and value = user friendly value
$prase = array("ABS" => "ABS (Anti lock braking System)"
,"DriverAirBag" => "Air bags");
$string= "ABS,DriverAirbag,GOGO,abs";
foreach($prase as $db=>$eu){
echo "if $db will be $eu<br>";
echo str_ireplace($eu,$db,$string);
}
echo $string;
上面试过,但史诗般的失败:D !..你能帮帮我吗?
在 PHP 中有一个映射并不是一个不合理的方法,但你正在倒退str_ireplace()
:它search, replace, subject
,所以在你的情况下str_ireplace($db, $eu, $string);
但是,无论如何,仅仅在逗号分隔的字符串列表中执行str_ireplace()
并不理想。首先,想象一下,如果在替换ABS
之后,您遇到了另一个与lock
匹配的配置文件项(恰好出现在"防抱死制动系统"中)。哎呀。现在您已经覆盖了之前的替换!
像这样的事情怎么样:
$prase = array("ABS" => "ABS (Anti lock braking System)"
,"DriverAirBag" => "Air bags");
$string= "ABS,DriverAirbag,GOGO,abs";
$fields = explode(',', $string);
foreach($fields as $field) {
$friendly = $field;
if (isset($phrase[$field]))
$friendly = $phrase[$field];
echo htmlspecialchars($friendly) . ': <input type="text" name="' . htmlspecialchars($field) . '" />
}
这里的关键是你分别处理每个字段。而且您绝不只是在进行更换;您正在专门查找关键字"ABS"或"驾驶员安全气囊"。如果没有完全匹配,则该项目没有人性化的名称,并且进行任何替换都没有意义。
如果您能够更改数据库架构,所有这些都可以进一步改进。存储逗号分隔的列表是不可取的。您应该有一个包含类似架构的表:
- field_id(例如,"获取和惠益分享")
- 名称(例如,"防抱死制动系统")
还有一张桌子,比如:
- user_id(我在这里从名称
addUsers
推断出一点 - 无论您现在在addUser中具有识别该人的任何字段) - field_id(即上
field
表的外键)
请注意,对于每个人,您最终可能会在此表中产生许多行(1, 'ABS'), (1, 'DriverAirbag')
但是,您的查询可能会变成
SELECT field, name
FROM user_field
INNER JOIN field USING (field_id)
现在,您可以为每个字段返回一行(不需要explode
!),并且每行都包含计算机友好和人类友好的名称。