如何更改密钥以使用循环将多维数组保存到数据库中?

时间:2017-05-25 22:10:59

标签: php arrays multidimensional-array

我有一个包含许多行数据的表单,其中每一行都包含所有相同类型的数据。因此,每行都有“ID”,“名称”,“注释”,“状态”

所以我的表格看起来像这样。即使你不了解Laravel,也很明显发生了什么:

 <td>{!!Form::text("cat_id[$category->category_id]", $category->category_id) !!}</td>
 <td>{!! Form::text("cat_name[$category->category_id]",$category->name)!!}</td>
 <td>{!! Form::textarea("notes[$category->category_id]",$category->notes)!!}</td>
 <td>{!! Form::select("status[$category->category_id]", ['active'=>'Active' ,'deactivate' => 'Deactivate', 'delete' => 'Delete'],$category->status)!!}</td>

从表单中删除的POST数据不是很有用,如下所示:

array:5 [▼
"_token" => "XRuGUnf6xt7m4jlrjVa4tI954XLyIcLcqfy0NGr0"
"cat_id" => array:4 [▼
42 => "42"
22 => "22"
1 => "1"
31 => "31"
]
"cat_name" => array:4 [▼
42 => "Cedar"
22 => "Materials"
1 => "Products"
31 => "Slate"
]
"notes" => array:4 [▶]
"status" => array:4 [▶]
]

所以使用array_map,我重新格式化了数据,如下所示。我有两个问题:

我不知道如何在所有子数组中将所有键更改为正确的标签。“ID”,“名称”,“注释”,“状态”。

为了保存数据我假设我需要遍历每个子数组,并通过DB理解的特定键来识别值,即“ID”,“名称”,“注释”等我也很想知道完成这项工作的最佳方法。非常感谢 !

array:4 [▼
0 => array:4 [▼
  0 => "42"
  1 => "Cedar"
  2 => "Notes"
  3 => "active"
  ]
1 => array:4 [▼
  0 => "22"
  1 => "Asphalt"
  2 => "Notes"
  3 => "active"
  ]
2 => array:4 [▶]
3 => array:4 [▶]
]

1 个答案:

答案 0 :(得分:0)

如果您已经定义了表单字段,那么您自己的生活将变得非常困难。更改您的表单字段,以便以更好的格式发布您的数据。

<td>{!! Form::text("category[$category->category_id]['category_id']", $category->category_id) !!}</td>
<td>{!! Form::text("category[$category->category_id]['name']", $category->name) !!}</td>
<td>{!! Form::textarea("category[$category->category_id]['notes']", $category->notes)!!}</td>
<td>{!! Form::select("category[$category->category_id]['status']", ['active' => 'Active', 'deactivate' => 'Deactivate', 'delete' => 'Delete'], $category->status) !!}</td>

您的数据将以以下格式发布:

[
    'category' => [
        1 => [
            'category_id' => 1,
            'name'        => '...',
            'notes'       => '...',
            'status'      => '...',
        ],
        2 => [
            'category_id' => 2,
            'name'        => '...',
            'notes'       => '...',
            'status'      => '...',
        ],
        // ...
    ],
]

后续问题

如果您不知道数组的索引,而不是使用for循环,则可以使用foreach循环。

foreach ($array as $key => $value) {
    // ...
}

这可以很好地适用于您的情况,但是根据您的原始问题,它看起来好像您正在使用Laravel。因此,因为您想要更新现有的类别模型,我建议您使用以下内容。

// Find updated categories by ID and index collection by category ID
$ids = array_keys($request->category);
$categories = Category::whereIn('category_id', $ids)->get();

// Iterate through categories
$categories->each(function ($category) use ($request) {
    // Find category attributes in request POST data and update category
    $attributes = $request->category[$category->category_id];
    $category->update($attributes); 
});