首页 > 解决方案 > Laravel:将多维数组转换为集合

问题描述

在我的项目中,我有以下结构的动态形式:

- Date 1
  - Shift 1
    - Area 1
      - Cell 1
      - Cell 2
    - Area 2
      - Cell 3
      - Cell 4
  - Shift 2
    - Area 1
      - Cell 1
  ...

我使用以下多维数组从输入中获取数据:data[index][column],其中列可能是:日期、班次、区域、单元格或单元格内容。

然后我需要将此表单存储到数据库中,以便以后重新创建它。这很容易,因为我的数组有一个表格形式:

index | Date  | Shift | Area | Cell | Cell Content
1       05.06   1       1       1         100
2       05.06   1       1       2         99
3       05.06   1       2       3         55
4       05.06   1       2       4         66
5       05.06   2       1       1         35

但是当重新创建表单(从数据库中取回)时,最好将此数组转换为集合,以便能够执行以下 foreach:

foreach (dates as date)
  foreach (date->shifts as shift)
    foreach (shift->areas as area)
      foreach (area->cells as cell)
         echo cell->content
      endforeach
    endforeach
  endforeach
endforeach

在 Laravel 中可以吗?或者我需要使用旧方法:将当前元素与先例进行比较,并在不同时打破 for?

标签: laravelmultidimensional-arraycollections

解决方案


我在这里看到的问题是所有列都存储在同一个表中,即你有一个非规范化的结构。一个简单的解决方案是规范化您的数据(可能会带来成本),然后在 Laravel 中定义关系将非常简单。

所以我建议你把你的单表分成:

  • 日期(id,日期)
  • 班次(id、date_id、班次)
  • 区域(id、shift_id、区域)
  • 细胞(id,area_id,细胞)

现在您还可以选择拥有冗余数据并将 shift_id 和 date_id 添加到您的单元格表中。如果节省空间不是您关心的问题,则可以两种方式存储数据。

阅读有关规范化的更多信息https://www.geeksforgeeks.org/database-normalization-normal-forms/


推荐阅读