2015-04-04 165 views
2

我想让我的用户能够添加和删除列表中的项目。 列表的格式如下:item1,item2,item3每个项目用逗号分隔,除了最后一个项目不以一个结尾,第一个项目不以一个开头。 因此,当我的用户想要删除和物品例如item3我需要PHP删除它和它之前的逗号。如果他们想要删除item2我需要它也删除逗号和项目之前的逗号。如果用户想要删除item1我需要删除项目和它后面的逗号。如何从字符串中删除单词,用逗号分隔

我不是使用一个数组,因为林存储在MySQL数据库中

这个名单是我一直试图去上班的代码。它适用于除第1项以外的每个项目,当我尝试删除item1时,它无法找到它,因为它正在查找起始逗号而不是尾随的逗号。

$skills = 'item1,item2,item3,item4'; 
$skillToRemove = 'item1'; 
if(strpos($skills, $skillToRemove . ',') == 1) 
    $newSkills = str_replace(',' . $skillToRemove, '', $skills); 
else 
    $newSkills = str_replace($skillToRemove . ',', '', $skills); 
echo $newSkills; 
+0

你能告诉什么业务逻辑代表您的名单?你试图在这个字符串中存储在数据库中?它应该是标签,就像在计算器上:php,mysql,sql。在停车场或无车的地方,要不然等 – 2015-04-05 14:42:35

回答

2

请不要使用字符串!将您的项目放入数组中,如果需要打印,请使用implode()。但是,只要把你的物品放入一个这样的数组:

<?php 

    $skills = ["item1", "item2", "item3", "item4"]; 
    $skillToRemove = 'item1'; 
    unset($skills[array_search($skillToRemove, $skills)]); 

?> 

如果你要打印清单只是这样做:

echo implode(",", $skills); 
+2

^^当你发现自己有_list_工作或_collection_的东西,你应该操纵它作为一个数组。逗号分隔的字符串应该被认为是用于表示的_output_格式,而不是数据操作或存储格式。 – 2015-04-04 19:16:58

+0

对不起,我不应该使用数组,因为林存储在数据库中的表都表示林 – 2015-04-04 19:18:43

+0

@JamieThirkell参见[马克·贝克的评论](http://stackoverflow.com/questions/29450387/how-to-remove-word-from -string分离逐逗号/ 29450432?noredirect = 1个#comment47066792_29450450)! – Rizier123 2015-04-04 19:19:13

3

学会与阵列工作

$skills = 'item1,item2,item3,item4'; 
$skillToRemove = 'item1' 

$skillArray = explode(',', $skills); 
$findSkill = array_search($skillToRemove, $skillArray); 
if ($findSkill !== false) 
    unset($skillArray[$findSkill]; 
$skills = implode(',', $skillArray); 
+0

抱歉,我不应该使用阵列由于IM存储在数据库 – 2015-04-04 19:17:37

+1

Your're存储在数据库中的逗号分隔的列表列表已经指出林!!!!然后,你将有这样的问题,负载....使用数据库正确,规范的数据和数据库成为你....店逗号在数据库中分隔的列表,而你正在做很多额外的工作,为自己 – 2015-04-04 19:18:35

+0

@JamieThirkell ^^我建议你规范你的分贝到正常化3级。 – Rizier123 2015-04-04 19:20:03

0

你可以使用preg_replace删除选定的技能和trim把任何剩余的逗号,用这个:

$newSkills = trim(
    preg_replace("/((?<=^)|(?<=,))\\Q$skillToRemove\\E(,|$)/", "", $skills), 
    "," 
); 

正则表达式解释说:

/      Begin pattern 
((?<=^)|(?<=,))  Begin match with start of string (^) or comma. 
         The `?<=` makes sure this is will not be replaced. 
\Q     Begin quote skill string. Any characters between \Q and \E 
         including metacharacters (e.g. '+' or '.') will be treated 
         as literals. 
$skillToRemove  Match skill to remove (will be removed) 
\E     End of skill string quoting 
(,|$)     Followed by comma or end of string (will also be removed) 
/     End pattern 

例子:

$skills = 'item1,item2,item3,item4'; 
$skillToRemove = 'item4'; 
$newSkills = trim(
    preg_replace("/((?<=^)|(?<=,))\\Q$skillToRemove\\E(,|$)/", "", $skills), 
    "," 
); 
echo "Removed item4: ", $newSkills, PHP_EOL; 

输出:

Removed item4: item1,item2,item3  
相关问题