我有一个包含时间列表的对象数组 . 我必须将它固定在一个类似Matrix的数组中,以便将它放在一个表中 . 这是我earlier SO question on how to build calendar tables的一部分
$node->sessions = array(
1286452800, // '2010-10-07 14:00:00'
1286460000, // '2010-10-07 16:00:00'
);
$node->title = 'Foo';
$nodes[1] = $node;
$node->sessions = array(
1286452800, // '2010-10-07 14:00:00'
1286460000, // '2010-10-07 16:00:00'
1286461800, // '2010-10-07 16:30:00'
);
$node->title = 'Bar';
$nodes[2] = $node;
$node->sessions = array(
1286460000, // '2010-10-07 16:00:00'
1286461800, // '2010-10-07 16:30:00'
1286465400, // '2010-10-07 17:30:00'
);
$node->title = 'Baz';
$nodes[3] = $node;
这些代表了电影的播放表 . 从行动中可以看出here . 现在的代码太复杂了(恕我直言),可以简化,只是我不知道如何 . 也许通过一些Matrix-library?还是一些我不知道的algorythm?
生成的结构应该是一个表示 Headers 的数组(表的列名)和一个表示行的数组 . 如下:
$header = array(
' ', // empty "cell"
ttt, // ttt being the timestamp for '14:00'
uuu, // idem for '15:00'
vvv, // idem for '16:00'
www, // idem '17:00'
);
// title, 14:00, 15:00, 16:00, 17:00
$rows = array(
array(
'Bar', 1286452800, '', array(1286460000, 1286461800), '', //Both 16:00 and 16:30 grouped under 16:00 'header'
),
array(
'Baz', '', '', array(1286460000, 1286461800), 1286465400
),
array(
'Foo', 1286452800, '', 1286460000, '',
)
);
每行应具有相同数量的“单元格” . 时间戳应按其所属的小时分组(16:15,16:30等所有分组在16:00以下)同时请注意,上面给出的输出结构也可以进行优化,如果有方法可以简化,请告诉我代码,通过简化或更改生成的“矩阵” .
我现在做的伪代码:
按 Headers
-
usort $ nodes
-
循环遍历所有$节点以查找矩阵的宽度(14:00到17:00)并填充
$header
-
再次遍历所有$节点,对于$ header上的每个节点循环,并使用empties
('')
或时间戳填充数组 .
现在,对于上面的三个条目,这不是一个大问题,但是这个矩阵可以变得非常宽(大的$ headers数组)和深(很多$节点),导致大量的重复循环 . 但性能和重复循环不是我最关心的问题,主要是拥有更清晰,嵌套更少,代码更简单的代码 . :)
1 回答
我正在报废你的想法,希望它可以帮到你 .
首先以这种格式获取数据:
这是工作代码的链接:http://ideone.com/P4zZn
这是代码