如何更正数组以创建所需的表输出


How do I correct my arrays to create my desired table output?

我有两个数组,一个用于在类似表的结构中创建第一列(服务),另一个用于此后每隔一列(天)创建一列。第一列阵列具有以下结构:

Array
(
    [0] => DPW
    [1] => PNS
    [2] => WS1
    [3] => WS2
)

这是一个动态数组,因此可能有更多的值,但它将始终是唯一的,并按字母顺序排序。

我的其他列的第二个数组具有以下结构:

Array
(
    [0] => Array
        (
            [Monday] => Array
                (
                    [0] => Array
                        (
                            [date] => 42016
                            [message] => 07:00 START
                            [service] => DPW
                        )
                    [1] => Array
                        (
                            [date] => 42016
                            [message] => 16:30 START
                            [service] => PNS
                        )
                    [2] => Array
                        (
                            [date] => 42016
                            [message] => 
                            [service] => WS1
                        )
    // etc ...

    [3] => Array
        (
            [Thursday] => Array
                (
                    [0] => Array
                        (
                            [date] => 42017
                            [message] =>
                            [service] => DPW
                        )
                    [1] => Array
                        (
                            [date] => 42017
                            [message] => 16:00 CUT OFF
                            [service] => DPW
                        )
                    [2] => Array
                        (
                            [date] => 42017
                            [message] =>
                            [service] => PNS
                        )
                )
        )
)

所以基本上每天都是下一个专栏。我的问题是,我最初认为第二个数组中的服务密钥每天的顺序总是相同的,但事实并非如此。你可以从周四看到,DPW是连续两次,而周一不是。我可以更改这些数组的格式,所以这就是我的问题所在。

查看所需输出

我的想法是,对于初学者来说,一天应该包含与服务数组相同数量的键,那么我应该添加一个空白值来组成相同数量的密钥吗?为了连续满足相同的服务,我是否应该添加一个级别来满足多个值,如下所示:

Array
(
    // etc ...

    [3] => Array
        (
            [Thursday] => Array
                (
                    [0] => Array
                        (
                            [0] => Array
                                (
                                    [date] => 42017
                                    [message] =>
                                    [service] => DPW
                                 )
                            [1] => Array
                                (
                                    [date] => 42017
                                    [message] =>
                                    [service] => DPW
                                 )
                        )
                    [2] => Array
                        (
                            [0] => Array
                                (
                                    [date] => 42017
                                    [message] =>
                                    [service] => PNS
                                 )
                        )
                    [3] => Array
                        (
                        )
                    [4] => Array
                        (
                        )
                )
        )
)

我还添加了空白值。最后,我如何按照与第一个(服务)数组相同的顺序打印这些值,使它们不在错误的服务下?

如果很难解释这一点,我可能会走错路,但这就是我提出问题的原因。



编辑:

几乎做到了这一点,我现在唯一的问题是,我需要将开始和截止日期显示为同一个项目,分布在多天内。例如,数组可能在某个时刻具有以下值:

[1] => Array
    (
        [date] => 42016
        [message] => 16:30 START
        [service] => DPM
    )
// etc...
[3] => Array
    (
        [date] => 42021
        [message] => 16:30 CUT OFF
        [service] => DPM
    )

所以我需要一种方法,把它们放在自己的一排,用背景色或其他东西来显示它们是同一件物品,就像上图一样。不确定这是否可能?

谢谢罗伯特!

我不确定这是否正是您想要的,但它可能会有所帮助:

$services = array('DPW', 'PNS', 'WS1', 'WS2');
$days = array(
    array(
        'Monday' => array(
                    array(
                            'date' => 42016,
                            'message' => '07:00 START',
                            'service' => 'DPW'
                        ),
                    array(
                            'date' => 42016,
                            'message' => '16:30 START',
                            'service' => 'PNS'
                        ),
                    array(
                            'date' => 42016,
                            'message' => '',
                            'service' => 'WS1'
                        ),
                ),
    ),
    array(
            'Thursday' => array(
                    array(
                            'date' => 42017,
                            'message' => '',
                            'service' => 'DPW'
                        ),
                    array(
                            'date' => 42017,
                            'message' => '16:00 CUT OFF',
                            'service' => 'DPW'
                        ),
                    array(
                            'date' => 42017,
                            'message' => '',
                            'service' => 'PNS'
                        )
                )
        )
    );

这是HTML表:

<?php $service_days = []; ?>
<table cellpadding="10" width="100%" align="left">
    <thead>
        <td style="background:#333;color:#FFF">Service</td>
        <?php foreach($days as $day): ?>
            <td style="background:#666;color:#FFF"><?php echo array_keys($day)[0]; ?></td>
            <?php 
              foreach(array_values($day)[0] as $d)  
                   $service_days[array_keys($day)[0]][$d['service']][] = $d;
           ?>
        <?php endforeach; ?>
    </thead>
    <?php foreach($services as $service):  ?>
        <tr>
            <td><?php echo $service ?></td>     
            <?php foreach($service_days as $day => $srv): ?>
                <td>    
                <?php foreach($srv as $_service => $periode): ?>
                    <?php if($_service == $service): ?>
                            <?php foreach($periode as $p): ?>
                                <p style="background:#DDD"><?php echo $p['date'], '<br>', $p['message']; ?></p>
                            <?php endforeach; ?>
                    <?php endif; ?>
                <?php endforeach; ?>
                &nbsp;</td> 
            <?php endforeach; ?>
        </tr>
    <?php endforeach; ?>    
</table>