2015-04-04 223 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  
相關問題