改进合并单元的算法

时间:2015-10-24 13:44:42

标签: php arrays algorithm

我对html表的合并单元格有以下算法,我想知道我是否有另一种方法来改进我的代码并使其更快或以其他方式重写此代码。

$matrix=array("person1"=>array("wifes"=>array("diana"=>array("born"=>1982,"last_name"=>"chapelle"),"carla"=>array("born"=>1983,"last_name"=>"michael"),"serena"=>array("born"=>1984,"last_name"=>"mickelson")
            ,"king"=>array("born"=>1980,"last_name"=>"jordan")))
    ,"person2"=>array("husbands"=>array("charles"=>array("born"=>1983,"last_name"=>"rambo")
    ,"minglen"=>array("born"=>1973,"last_name"=>"rian"),"serrano"=>array("born"=>1914,"last_name"=>"kingside"))));

$htmlx="<table border='1'>";
    $htmlx.="<tr>";
    $htmlx.="<th>object</th><th>type</th><th>names</th><th>detail_names</th><th>values_detail</th>";
    $html_p=NULL; $p=0; 
    foreach ($matrix as $pkey => $pvalue) {
        $t=0;   $html_t=NULL;
        foreach ($pvalue as $tkey => $tvalue) {
            $n=0;   $html_n=NULL;   $rs_general=0;
            foreach ($tvalue as $nkey => $nvalue) {
                $d=0;   $html_d=NULL;   $rs_general+=count($nvalue);
                foreach ($nvalue as $dkey => $dvalue) {

                    $d++;
                    if($d==1){
                        $html_d="<td>".$dkey."</td><td>".$dvalue."</td>";
                    }else{
                        $html_d.="<tr><td>".$dkey."</td><td>".$dvalue."</td></tr>";
                    }
                }
                $n++;
                if($n==1){
                    $html_n.="<td rowspan='".count($nvalue)."'>".$nkey."</td>".$html_d;
                }else{
                    $html_n.="<tr><td rowspan='".count($nvalue)."'>".$nkey."</td>".$html_d."</tr>";
                }
            }
            $t++;
            if($t==1){
                $html_t="<td  rowspan='".$rs_general."'>".$tkey."</td>".$html_n;
            }else{
                $html_t.="<tr><td  rowspan='".$rs_general."'>".$tkey."</td>".$html_n."</tr>";
            }
        }
        $p++;
        if($p==1){
            $html_p.="<td rowspan='".$rs_general."'>".$pkey."</td>".$html_t;
        }else{
            $html_p.="<tr><td rowspan='".$rs_general."'>".$pkey."</td>".$html_t."</tr>";
        }

    }
    $htmlx.="</tr>".$html_p;
$htmlx.="</table>";
echo $htmlx;

结果给了我3列合并,我想知道是否有人有一个关于如何在html表上创建合并单元格但使用维数组的简单示例?看来唯一的方法是通过循环foreach

1 个答案:

答案 0 :(得分:0)

我发现这个问题很有趣,所以我想出了一个不同的方法。我使用了RecursiveIteratorIterator中的Standard PHP Library。它没有经过优化,也许没有调用countChildren就有更好的方法。

所以它比你的解决方案更慢但更灵活,更易读。

function countChildren($array)
{
    $iterator = new RecursiveIteratorIterator(
        new RecursiveArrayIterator($array),
        RecursiveIteratorIterator::CHILD_FIRST
    );
    $count = 0;
    foreach ($iterator as $key => $value) {
        if (!is_array($value)) {
            $count++;
        }
    }
    return $count;
}

function getTable($array, $headerRow = '')
{
    $iterator = new RecursiveIteratorIterator(
        new RecursiveArrayIterator($array),
        RecursiveIteratorIterator::SELF_FIRST
    );
    $out = '<table border="1">'.$headerRow;
    $lastDepth = 0;

    foreach ($iterator as $key => $value) {
        $depth = $iterator->getDepth();
        if (!is_array($value)) {
            if ($lastDepth >= $depth) {
                $out .= '<tr>';
            }
            $out .= '<td>'.$key.'</td><td>'.$value.'</td></tr>';
        }
        else {
            if ($depth == 0) {
                $out .= '<tr>';
            }
            $out .= '<td rowspan="'.countChildren($value).'">'.$key.'</td>';
        }
        $lastDepth = $depth;
    }
    return $out;
}

echo getTable(
    $matrix,
    '<th>object</th>
    <th>type</th>
    <th>names</th>
    <th>detail_names</th>
    <th>values_detail</th>'
);