在逗号分隔列表中添加或删除项目

时间:2015-04-20 20:23:28

标签: php laravel

我在以逗号分隔的列表中添加和/或删除项目时遇到了一些问题。我使用<select>表单字段来选择要添加和/或删除的项目。

<select name="choices[]" multiple>
    <option value="1">Option 1</option>
    <option value="2">Option 2</option>
    <option value="3">Option 3</option>
    <option value="4">Option 4</option>
    <option value="5">Option 5</option>
    <option value="6">Option 6</option>
</select>

// explode list from database (choices column)
$array = explode(',', $row->choices);

// loop through html select options
foreach(Input::get('choices') as $value)
{
    // add selected items
    if($value && !in_array($value, $array))
    {
        $array[] = $value;
    }

    // remove deselected items
    if(!$value && in_array($value, $array))
    {
        $index = array_search($value, $array);
        unset($array[$index]);
    }
}

// re-delimit list; update database
$row->choices = trim(implode(',', $array), ',');

将项目添加到列表的功能按预期工作。但是,取消选择项目时,它不会从列表中删除它们。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

当您循环遍历Input::get('choices')时,该数组只会为您提供用户选择的项目(如果您将其打印出来,您已经看过了)。 Input::get并不知道您的HTML中有哪些可能的值;它只知道通过HTTP GET提交的值。

因此,您对!$value的检查无效 - 未选择的值根本无法完成。如果未选中的值在数据库中开始,那么它们将保留在那里。

从空$array开始不是更好吗?然后只需将Input::get('choices')的元素复制到其中?然后将其存储在数据库中。

答案 1 :(得分:0)

Input::get('choices')中不会显示未选中的值,因此,如果您选择选项2和选项3,则Input::get('choices')将仅包含它们:["2", "3"]。您所要做的就是从请求中加入并保存值:

$choices = join(',', Input::get('choices'));
$row->choices = $choices;
$row->save();