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]);
}
}
}
我正在根据标签关联预测用户兴趣。这些关联将使用 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]);
}
}
}