PHP 中的高级阵列重建

Advanced array rebuilding in PHP

我正在根据标签关联预测用户兴趣。这些关联将使用 ChartJS 绘制在多线图表中。我已经到了数据格式几乎可以在客户端使用的地步。

不要被数组的大小吓到。我的问题很简单,但似乎很难解决。

考虑以下数组(包括示例数据):

array:3 [▼
  "timespan" => "day",
  "labels" => array:3 [▼ // Date labels based on timespan
    0 => "2016-06-10"
    1 => "2016-06-11"
    2 => "2016-06-12"
  ],
  "data" => array:2 [▼
    0 => array:3 [▼
      "id" => 16473,
      "name" => "FooTag"
      "timeline" => array:3 [▼
        0 => array:3 [▼
          "Date" => "2016-06-10"
          "Frequency" => 2
          "Score" => 4.0
        ]
        1 => array:3 [▼
          "Date" => "2016-06-12"
          "Frequency" => 2
          "Score" => 4.0
        ]
      ]
    ]
    1 => array:3 [▼
      "id" => 10814,
      "name" => "BarTag"
      "timeline" => array:1 [▼
        0 => array:3 [▼
          "Date" => "2016-06-10"
          "Frequency" => 2
          "Score" => 3.0
        ],
        1 => array:3 [▼
          "Date" => "2016-06-11"
          "Frequency" => 10
          "Score" => 20.0
        ]
      ]
    ]
  ]
]

...确保每个日期标签(2016-06-10、206-06-11、2016-06-12)都包含在 data[i][timeline] 内的每个时间线中。如果该特定日期标签的时间线中没有可用数据,则必须插入一个空数组。

结果将是:

array:3 [▼
  "labels" => array:3 [▼ // Date labels based on timespan
    0 => "2016-06-10"
    1 => "2016-06-11"
    2 => "2016-06-12"
  ]
  "timespan" => "day"
  "data" => array:2 [▼
    0 => array:3 [▼
      "id" => 16473,
      "name" => "FooTag"
      "timeline" => array:3 [▼
        0 => array:3 [▼
          "Date" => "2016-06-10"
          "Frequency" => 2
          "Score" => 4.0
        ],
        1 => array:0 [], // No data for label 2016-06-11, empty array added
        2 => array:3 [▼
          "Date" => "2016-06-12"
          "Frequency" => 2
          "Score" => 4.0
        ]
      ]
    ]
    1 => array:3 [▼
      "id" => 10814,
      "name" => "BarTag"
      "timeline" => array:1 [▼
        0 => array:3 [▼
          "Date" => "2016-06-10"
          "Frequency" => 2
          "Score" => 3.0
        ],
        1 => array:3 [▼
          "Date" => "2016-06-11"
          "Frequency" => 10
          "Score" => 20.0
        ],
        2 => array:0 [], // No data for label 2016-06-12, empty array added
      ]
    ]
  ]
]

在这种情况下,每个关联标签都有每个日期的数据。否则在绘制图表时数据(频率和得分)将与正确的日期不匹配。

我希望这是有道理的。提前致谢!

假设 $array['labels'] 是最终的日期列表,并且 $array['data'][$i]['timeline'] 将始终按升序排序并且绝不会包含不在 $array['labels']:

中的日期
$labels = $array['labels'];

foreach ($array['data'] as &$tag) {
   foreach ($labels as $i => $date) {
      if (!isset($tag['timeline'][$i]) || $tag['timeline'][$i]['Date'] != $date) {
         $blank = [];
         array_splice($tag['timeline'], $i, 0, [$blank]);
      }
   }
}