改进了合并单元的算法


Improve algorithm for merged cell

我有以下算法为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

我发现这个问题很有趣,所以我想出了一个不同的方法。我使用了标准PHP库中的递归迭代器。它没有被优化,也许有一个更好的方法不调用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>'
);