大家好。我有两个数组,想要比较它们以找到共同的元素。如果存在匹配值,那么这些值应该在select元素上获得selected attribute
,否则那些不匹配的值不应该具有selected属性。
这是我的两个阵列:
DD($于角色>权限);
array:3 [▼
"edit-student" => "true"
"create-student" => "true"
"create-guardian" => "true"
]
DD($权限);
array:5 [▼
"create-student" => "true"
"edit-student" => "true"
"delete-student" => "true"
"create-guardian" => "true"
"delete-guardian" => "true"
]
这是我视图中的代码:
<select class="form-control permissions" multiple="multiple" style="width: 100%;" name="permissions[]" >
@foreach($permissions as $key => $val)
@foreach($role->permissions as $roleKey => $roleVal)
@if($key == $roleKey)
<option value="{{$val}}" selected="">{{$key}}</option>
@else
<option value="{{$val}}">{{$key}}</option>
@endif
@endforeach
@endforeach
</select>
这会返回正确的选定值,但选择列表中的选定值会有重复,这就是我想要避免的。 这张照片展示了我正在谈论的内容。
在图片中,您可以看到即使选择了正确的值,如何重复这些值。我怎样才能避免这种情况发生?我知道问题在于视图中的逻辑,但不知道如何重构它。有帮助吗?非常感谢,谢谢。
答案 0 :(得分:1)
在将数组放入控件之前,请合并并使它们唯一;
$finalArray = array_unique(array_merge($role->permissions, $permissions));
答案 1 :(得分:1)
问题是你在第二个option
的每次迭代中都写了一个array
。您需要使用$found
变量,该变量将在第一个false
之后初始化为foreach
,并在第二个true
内将其设置为foreach
找到一个匹配。您不需要为内部option
的每次迭代生成foreach
。您需要在第二个$found
之后检查foreach
的值,如果是true
,则该项目将为selected
。如果没有,那么该项目将不是selected
。
编辑:
一个例子:
<select class="form-control permissions" multiple="multiple" style="width: 100%;" name="permissions[]" >
<?php foreach($permissions as $key => $val) { ?>
<?php
$found = isset($role->permissions[$key]);
if($found) ?>
<option value="{{$val}}" selected="">{{$key}}</option> <?php
else ?>
<option value="{{$val}}">{{$key}}</option> <?php
} ?>
</select>
请注意,我们可以使用isset
来避免内部迭代。
答案 2 :(得分:0)
你的for循环错了。如果它们在您的角色权限数组中,您应该遍历所有元素,它们将被选中。
<select class="form-control permissions" multiple="multiple" style="width: 100%;" name="permissions[]" >
@foreach($permissions as $key => $val)
<option value="{{$val}}" {{ isset($role->permissions[$key]) ? 'selected=\"\"' : ''}}">{{$key}}</option>
@endforeach
</select>