1

我现在正在制作一个表格来显示会计数据,发票分为许可证、年、半年和季度。发票来自作为二维数组的查询,如下所示:

array(
    'invoice0' = array(data),
    'invoice2' = array(data),
    'invoice3' = array(data),
    'invoice4' = array(data),
    'invoice5' = array(data),
    'invoice1' = array(data)
)

目前我一直在使用一个看起来相当邪恶的四深嵌套 foreach 循环来创建一个 5d 数组结构来组织行,每个级别都有数据行。例如:

'License' = array(
  'Year0' = array(
    'Half0' = array(
      'Quarter0' = array(
        'invoice0' = array(data),
        'invoice1' = array(data)
      ),
      'QData' = array(data)
    ),
    'HData' = array(data)
    'Half1' = array(
      'Quarter0' = array(
        'invoice3' = array(data),
        'invoice4' = array(data)
      ),
      'Quarter1' = array(
        'invoice5' = array(data),
        'invoice6' = array(data)
      ),
      'QData' = array(data)
    ),
    'HData' = array(data)
  ),
  'YData' = array(data)
)

等等。每个级别的数据需要在每个发票的数据中包含一个金额的总和。我试图实现的最终产品只是一堆可扩展的表格行(或列表项;我仅限于该项目的表格结构)。所以:

<tr>License info</tr>
<tr>License info</tr>
<tr>License info</tr>
<tr>License info</tr>

当您单击一个时:

<tr>License info</tr>
<tr>License info</tr>
<tr>Year1 Info</tr>
<tr>Year2 Info</tr>
<tr>Year3 Info</tr>
<tr>License info</tr>
<tr>License info</tr>

最终:

<tr>License info</tr>
<tr>License info</tr>
<tr>Year1 Info</tr>
<tr>Year2 Info</tr>
<tr>Half1 Info</tr>
<tr>Quarter1 Info</tr>
<tr>Quarter2 Info</tr>
<tr>Invoice1 Info</tr>
<tr>Invoice2 Info</tr>
<tr>Invoice3 Info</tr>
<tr>Quarter3 Info</tr>
<tr>Quarter4 Info</tr>
<tr>Half2 Info</tr>
<tr>Year3 Info</tr>
<tr>License info</tr>
<tr>License info</tr>

那么,有什么想法吗?有什么办法可以避免这种复杂的数据操作,同时还能让我得到一个 5 深的分层下拉列表?

4

1 回答 1

1

好的,我不完全明白你到底想要什么,但我这样做了,有点令人困惑,呵呵:

function get_data($data, $level = 0)
{
    $html = '';

    foreach ($data as $name => $val) {
        if (!is_int($name)) {
            if (!$level)
                $html .= '<tr>';
            $html .= '<ul>';
            $html .= '<li><span class="parent">'.$name.'</span>';
            $html .= get_data($val, $level + 1);
            $html .= '</li></ul>';
            if (!$level)
                $html .= '</tr>';
        } else {
            $html .= '<ul><li>'.$val.'</li></ul>';
        }
    }
    return $html;
}

HTML 应该如下所示(使用 jQuery):

<style>
span.parent {
    cursor:pointer;
}
ul ul {
    display:none;
}
</style>
<table>
<?php echo get_data($data) ?>
</table>
<script>
$('span.parent').click(function(){
    if ($(this).hasClass('open')) {
        $(this).parent().children('ul').hide();
        $(this).removeClass('open');
    } else {
        $(this).parent().children().show();
        $(this).addClass('open');
    }
})
</script>

我用以下数组尝试了这个,并且......它工作得很好,但是,我不知道这是否是你要找的。

$data = array(
    'License' => array(
        'Year0' => array(
            'Half0' => array(
                'Quarter0' => array(
                    'invoice0' => array('data'),
                    'invoice1' => array('data')
                ),
                'QData' => array('data')
            ),
            'HData' => array('data'),
            'Half1' => array(
                'Quarter0' => array(
                    'invoice3' => array('data'),
                    'invoice4' => array('data')
                ),
                'Quarter1' => array(
                    'invoice5' => array('data'),
                    'invoice6' => array('data')
                ),
                'QData' => array('data')
            ),
            'HData' => array('data')
        ),
        'YData' => array('data')
    ),

    'License2' => array(
        'Year0' => array(
            'Half0' => array(
                'Quarter0' => array(
                    'invoice0' => array('data'),
                    'invoice1' => array('data'),
                ),
                'QData' => array('data')
            ),
            'HData' => array('data'),
            'Half1' => array(
                'Quarter0' => array(
                    'invoice3' => array('data'),
                    'invoice4' => array('data')
                ),
                'Quarter1' => array(
                    'invoice5' => array('data'),
                    'invoice6' => array('data')
                ),
                'QData' => array('data')
            ),
            'HData' => array('data')
        ),
        'YData' => array('data')
    )
);
于 2012-09-07T17:33:29.893 回答