【问题标题】:Laravel Array Keys not PreservedLaravel 数组键未保留
【发布时间】:2015-03-11 23:14:40
【问题描述】:

当前运行 Laravel 4.1.31。在控制器中,以用户 ID 为键构建了一个用户数组:

$owners = User::get()->lists('username','id');

在控制器级别打印出所有者数组将产生以下结果:

print_r($owners)

// Array
// (
//    [1] => user1
//    [2] => user2
//    [4] => user3  <--- key jumps to 4, this is correct
//    [5] => user4
//    [6] => user5
// )

但是,一旦将数组传递给视图,键就不会保留,在视图级别将其打印出来会产生以下结果:

// Array
// (
//    [1] => user1
//    [2] => user2
//    [3] => user3  <--- key was replaced with 3, this is incorrect
//    [4] => user4       all values from this point on are now shifted
//    [5] => user5
// )

原始数组中没有 3 个键,但是一旦将其传递到视图,所有内容都会转移以填补空白。这最终会导致问题,因为 2 以上的所有 id 现在都不匹配。如何保留数组键?

完整的控制器方法:

public function edit($id) {

  // get the task
  $task = $this->task->find($id);

  // grab all users for owner field
  $owners = User::get()->lists('username','id');

  // grab all projects for project field
  $projects = Project::get()->lists('title','id');

  // add placeholder to beginning of arrays
  array_unshift($owners, 'Select Owner');
  array_unshift($projects, 'Select Project');

  // return show view
  return View::make('tasks.edit', array(
    'task'     => $task,
    'status'   => $this->status,
    'projects' => $projects,
    'owners'   => $owners
  )); 

}

【问题讨论】:

  • 你能告诉我们完整的控制器动作吗?
  • 这可能是我没有使用列表的原因。如果你改变它对你有用吗:$owners = User::select("username", "id")-&gt;distinct()-&gt;get();
  • @lukasgeiter 添加了方法。
  • array_unshift 之前执行dd($owners) 并记下结果。然后在array_unshift 之后执行一个,然后更改密钥还是仅在发送到tasks.edit 时更改?
  • @TimLewis 就是这样...array_unshift 没有保留密钥。

标签: php arrays laravel laravel-4


【解决方案1】:

array_unshift 更改数组的键。它会将它们重置为数字序列 0,1,2,3,...

使用它在数组的开头添加一个带有键 "" 的值:

$owners = ['' => 'Select Owner'] + $owners;

【讨论】:

    【解决方案2】:

    如 cmets 中所述,删除两个数组上的 array_unshift。在视图中,按如下方式处理:

    <select name="projects">
      <option value="">Select Project</option>
      @foreach($projects AS $project)
      <option value="{{ $project->id }}">{{ $project->title }}</option>
      @endforeach
    </select>
    

    不要将第一个元素设为通用值,而是在处理@foreach 以进行选择之前对其进行硬编码。

    希望有帮助!

    【讨论】:

    • 哦。好吧,因为我从来没有使用过 Laravel 的 Form::* 函数,所以我不知道......不过你说得很好。我觉得不使用Form::* 我有更多的控制权,所以我从不打扰它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2022-01-21
    • 2021-05-29
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多