如何比较Laravel中的两个数组使用匹配和不匹配的值填充选择列表

时间:2017-09-20 08:06:19

标签: php arrays laravel

大家好。我有两个数组,想要比较它们以找到共同的元素。如果存在匹配值,那么这些值应该在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>

这会返回正确的选定值,但选择列表中的选定值会有重复,这就是我想要避免的。 这张照片展示了我正在谈论的内容。

enter image description here

在图片中,您可以看到即使选择了正确的值,如何重复这些值。我怎样才能避免这种情况发生?我知道问题在于视图中的逻辑,但不知道如何重构它。有帮助吗?非常感谢,谢谢。

3 个答案:

答案 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>