代码之家  ›  专栏  ›  技术社区  ›  Q_Mlilo

PHP循环优化

php
  •  4
  • Q_Mlilo  · 技术社区  · 14 年前

    我有一个php方法,用它从属性检索的数据创建一个HTML表。

    public function getHTML() {
    
        $phpObj =  json_decode($this->data); // array(object, object, object, ....);
    
        $table = "<table><tbody>\n";
    
        if (count($phpObj->query->results->row) > 0) {
            $row = $phpObj->query->results->row;
    
             foreach ($row as $value) {
                $table .= "<tr>\n";
                foreach ($value as $key => $val) { // concerned about loop inside loop
                    $table .= "<td>" . $value->$key . "</td>"; 
                }
                $table .= "\n</tr>\n";
            }   
    
            $table .= "</tbody></table>";
            return $table;
        }
        else {
            return 'HTML table not created.';
        }       
    }
    

    有没有更有效的方法来遍历数组和对象而不在循环中创建循环?

    5 回复  |  直到 14 年前
        1
  •  4
  •   Vincent    14 年前

    循环中的循环通常是遍历二维数组的最佳方式。

        2
  •  2
  •   Gumbo    14 年前

    public function getHTML() {
        $phpObj =  json_decode($this->data);
        if (count($phpObj->query->results->row) > 0) {
            $rows = array();
            foreach ($phpObj->query->results->row as $row) {
                $cells = array();
                $rows[] = "<td>" . implode("</td><td>", $row) . "</td>";
            }
            return "<table><tbody>\n<tr>\n" .
                   implode("\n<tr>\n<tr>\n", $rows) .
                   "\n</tr>\n</tbody></table>";
        } else {
            return 'HTML table not created.';
        }
    }
    

    你也可以用 anonymous functions (从PHP 5.3开始提供):

    public function getHTML() {
        $phpObj =  json_decode($this->data);
        if (count($phpObj->query->results->row) > 0) {
            return "<table><tbody>\n<tr>\n" .
                   implode("\n<tr>\n<tr>\n", array_map(function($cells) { return "<td>".implode("</td><td>", $cells)."</td>"; }, $phpObj->query->results->row)) .
                   "\n</tr>\n</tbody></table>";
        } else {
            return 'HTML table not created.';
        }
    }
    
        3
  •  1
  •   Mike Axiak    14 年前

    schrapnel上校正确地指出,奇怪的是,字符串连接在php中实际上相对较快。

    正如文森特所说,不要运行一堆串联,那会害死你的。有两个选项可以加快脚本速度:

    1. 将行存储在一个数组中,并在末尾加入数组。

    两个例子:

    <?php
    
    $mylines = array();
    foreach ($row as $value) {
        $mylines[] = "<tr>\n";
        foreach ($value as $key => $val) { // concerned about loop inside loop
            $mylines[] = "<td>" . $value->$key . "</td>"; 
        }
        $mylines[] = "\n</tr>\n";
    }
    return implode('', $mylines);
    
        4
  •  0
  •   Kendall Hopkins    14 年前

    您可以将HTML构建移到前端,并通过AJAX和javascript将JSON数据发送给用户。

    我知道我没有直接回答这个问题。这是因为你的代码可能是最快的,它可以做(在PHP中)w/o做愚蠢的小优化,只会使代码更难读/维护(可能只节省了百分之几)。

    编辑:再看一遍,我敢打赌你的代码实际上只是在用JSON轮询来自外部源的数据。你可以删除这个代码 完全地 通过让前端javascript执行HTTP命中并处理那里的数据。这样就不需要运行这个PHP代码 完全 .

    implode .

    //declared this functions somewhere
    function tr_build( $row_value )
    {
        $tablerow .= "<tr>\n";
        if( $row_value ) {
            $tablerow .= "<td>".implode( "</td><td>", $row_value )."</td>";
        }
        $tablerow .= "\n</tr>\n";
        return $tablerow;
    }
    
    //this replaces the double loop
    if( $row ) {
        $tablerows = "<tr>\n".implode( "\n</tr>\n<tr>\n", array_map( "tr_build", $row ) )."\n</tr>\n"
    } else {
        $tablerows = "";
    }
    
        5
  •  0
  •   Mike    14 年前

    你为什么要烦这个?

            $table .= "<tr>\n";
            foreach ($value as $key => $val) { // concerned about loop inside loop
                $table .= "<td>" . $value->$key . "</td>"; 
            }
            $table .= "\n</tr>\n";
    

    你从来没用过 $val 那么为什么要有这个循环呢?

            $table .= "<table><td>";
            $table .= implode("</td><td>", array_keys($value));
            $table .= "</td></table>";