У меня есть массив объектов, содержащий списки раз. Я должен вставить это в матричный аналог массива, чтобы поместить его в таблицу. Это часть моего ранее SO вопроса о том, как строить календарные таблицы
$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;
Они представляют собой таблицу playdates фильмов. Как можно увидеть в действии здесь . Код для этого прямо сейчас слишком сложен (ИМХО) и может быть упрощен, просто я не знаю как. Может быть, через какую-нибудь Matrix-библиотеку? Или какой-то алгоритм, о котором я не знаю?
Результирующая структура должна быть массивом, представляющим заголовок (имена столбцов таблицы) и массивом с массивами, представляющими строки. Следующим образом:
$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)
Также обратите внимание, что приведенная выше структура вывода также может быть оптимизирована, пожалуйста, дайте мне знать, если есть способы упростить код, упростив или изменив полученную «матрицу».
Псевдокод для того, что я делаю сейчас:
- узлов usort $ по названию
- переберите все $ узлы, чтобы найти ширину матрицы (с 14:00 до 17:00) и заполните
$header
- снова зациклите все $ узлы, для каждого узла зациклите над $ header и заполните массив пустыми значениями
('')
или временными метками.
Теперь для трех записей выше, это не большая проблема, но эта матрица может расти очень широко (большой массив $ headers) и глубокой (много $ узлов), что приводит к большому количеству повторяющихся циклов.
Но производительность и дублирование циклов не являются моей главной заботой, в основном это более чистый и менее вложенный, менее сложный код. :)