在PHP RecursiveIteratorIterator

时间:2016-06-05 13:25:38

标签: php iterator key

我正在使用PHP RecursiveIteratorIterator函数生成基于我的DATABASE的动态HTML表格,如下所示:

class TableRows extends RecursiveIteratorIterator { 
    function __construct($it) { 
        parent::__construct($it, self::LEAVES_ONLY); 
    }

    function current() {
        return "<td>".parent::current()."</td>";
    }

    function beginChildren() { 
        echo "<tr>"; 
    } 

    function endChildren() { 
        echo "</tr>" . "\n";
    } 
} 

以下foreach循环生成每个新行并将数据传递给上面的迭代器。

foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
    echo $v;
}

我执行准备好的$stmt PDO,其中我从数据库中提取的第一个值始终是行的ID。

这一切都很有效。现在,我遇到的问题是我想在迭代器的name函数中的每个<td>元素上生成一个HTML current()参数。我需要这个name参数始终是当前RecursiveIteratorIterator循环的第一个key(在我的例子中,它将是每行的ID列值)。

这样的事情,所以我可以在每个ID元素中拥有row的{​​{1}}:

<td>

修改 整个代码

function current() {
    return "<td name='".***FIRST ITERATOR KEY VALUE HERE***."'>".parent::current()."</td>";
}

修改 我想要生成的示例表:

class TableRows extends RecursiveIteratorIterator { 
    function __construct($it) { 
        parent::__construct($it, self::LEAVES_ONLY); 
    }

    function current() {
        /* Here I need to add the value from the ID column to the <td name="... parameter */
        return "<td name='".***FIRST ITERATOR KEY VALUE HERE***."'>".parent::current()."</td>";
    }

    function beginChildren() { 
        echo "<tr>"; 
    } 

    function endChildren() { 
        echo "</tr>" . "\n";
    } 
} 

try 
{
    $conn = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("SELECT
                                    id,
                                    ddate,
                                    day,
                                    month,
                                    year,
                                    arrival,
                                    departure,
                                    serial_number,
                                    time_mark,
                                    observations
                                    FROM ROUTS WHERE ddate = '".$datecode."'");
    $stmt->execute();
    // set the resulting array to associative
    $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
    foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
        echo $v;
    }
}

catch(PDOException $e) 
{
    echo "Error: " . $e->getMessage();
}
$conn = null;

我希望有人可以就此事为我提供一些启示。

1 个答案:

答案 0 :(得分:1)

最后,在一位好老朋友的帮助下,我得到了我的问题的答案,我只想分享给可能遇到同样问题的其他人。 提供的解决方案是if RecursiveIteratorIterator 函数的current()语句,它检查parent::key是否是您需要的语句,如果它是PHP将分配parent::current()的{​​{1}}值为$this->id。这样,您可以稍后在return函数中获取值,如下面的示例代码所示。

function current() {
    if(parent::key() == 'id') { /* Check if parent::key is what you are looking for */
        $this->id = parent::current(); /* Assign parent::current to $this->id if true */
    }
        return "<td class='".parent::key()."'>".parent::current()."</td>";
    }