在 PHP 中重复第一个键值 RecursiveIteratorIterator

Repeat first key value in PHP RecursiveIteratorIterator

我正在使用 PHP RecursiveIteratorIterator 函数基于我的数据库生成动态 HTML table,如下所示:

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;
}

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

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

像这样,所以我可以在每个 <td> 元素中包含 rowID

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;

编辑: 我想生成的示例 table:

<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="table-styles.css">
        <title>Register</title>
    </head>
    <body>
        <form method='post' onsubmit="return confirm('Are you sure you want to submit?');">
            <table id='table-left'>
                <caption>11/22/33</caption>
                <caption>ROUTS</caption>
                <tr>
                    <th>ID</th>
                    <th>Date</th>
                    <th>Day</th>
                    <th>Month</th>
                    <th>Year</th>
                    <th>Arrival</th>
                    <th>Departure</th>
                    <th>S/N</th>
                    <th>Time Mark</th>
                    <th>Observation</th>
                </tr>
                <tr>
                    <td name="id-1">1</td> <!-- The value of this <td> tag needs to populate in the name of each next <td> 'name' parameter for this row!-->
                    <td name="ddate-1">03062016</td> <!-- Here I want to add this number "1" to the name of the <td> element.-->
                    <td name="day-1">Day</td> <!-- Here I want to add this number "1" to the name of the <td> element.-->
                    <td name="month-1">Month</td> <!-- Here I want to add this number "1" to the name of the <td> element.-->
                    <td name="year-1">Year</td> <!-- Here I want to add this number "1" to the name of the <td> element.-->
                    <td name="arrival-1">Arrival</td> <!-- Here I want to add this number "1" to the name of the <td> element.-->
                    <td name="departure-1">Departure</td> <!-- Here I want to add this number "1" to the name of the <td> element.-->
                    <td name="sn-1">S/N</td> <!-- Here I want to add this number "1" to the name of the <td> element.-->
                    <td name="time-mark-1">Time Mark</td> <!-- Here I want to add this number "1" to the name of the <td> element.-->
                    <td name="observation-1">Observation</td> <!-- Here I want to add this number "1" to the name of the <td> element.-->
                </tr>
                <tr>
                    <td name="id-2">2</td> <!-- The value of this <td> tag needs to populate in the name of each next <td> 'name' parameter for this row!-->
                    <td name="ddate-2">03062016</td> <!-- Here I want to add this number "2" to the name of the <td> element.-->
                    <td name="day-2">Day</td> <!-- Here I want to add this number "2" to the name of the <td> element.-->
                    <td name="month-2">Month</td> <!-- Here I want to add this number "2" to the name of the <td> element.-->
                    <td name="year-2">Year</td> <!-- Here I want to add this number "2" to the name of the <td> element.-->
                    <td name="arrival-2">Arrival</td> <!-- Here I want to add this number "2" to the name of the <td> element.-->
                    <td name="departure-2">Departure</td> <!-- Here I want to add this number "2" to the name of the <td> element.-->
                    <td name="sn-2">S/N</td> <!-- Here I want to add this number "2" to the name of the <td> element.-->
                    <td name="time-mark-2">Time Mark</td> <!-- Here I want to add this number "2" to the name of the <td> element.-->
                    <td name="observation-2">Observation</td> <!-- Here I want to add this number "2" to the name of the <td> element.-->
                </tr>
                <tr>
                    <td name="id-3">3</td> <!-- The value of this <td> tag needs to populate in the name of each next <td> 'name' parameter for this row!-->
                    <td name="ddate-3">03062016</td> <!-- Here I want to add this number "3" to the name of the <td> element.-->
                    <td name="day-3">Day</td> <!-- Here I want to add this number "3" to the name of the <td> element.-->
                    <td name="month-3">Month</td> <!-- Here I want to add this number "3" to the name of the <td> element.-->
                    <td name="year-3">Year</td> <!-- Here I want to add this number "3" to the name of the <td> element.-->
                    <td name="arrival-3">Arrival</td> <!-- Here I want to add this number "3" to the name of the <td> element.-->
                    <td name="departure-3">Departure</td> <!-- Here I want to add this number "3" to the name of the <td> element.-->
                    <td name="sn-3">S/N</td> <!-- Here I want to add this number "3" to the name of the <td> element.-->
                    <td name="time-mark-3">Time Mark</td> <!-- Here I want to add this number "3" to the name of the <td> element.-->
                    <td name="observation-3">Observation</td> <!-- Here I want to add this number "3" to the name of the <td> element.-->
                </tr>
                <tr>
                    <td><input class='hdl' type='text' name='id' value=''></input></td>
                    <td><input class='hdl' type='text' name='date' value=''></input></td>
                    <td><input class='hds' type='text' name='day' value=''></input></td>
                    <td><input class='rm' type='text' name='month' value=''></input></td>
                    <td><input class='hm' type='text' name='year' value=''></input></td>
                    <td><input class='ob' type='text' name='arr' value=''></input></td>
                    <td><input class='pre' type='text' name='dep' value=''></input></td>
                    <td><input class='prs' type='text' name='sn' value=''></input></td>
                    <td><input class='vol' type='text' name='tm' value=''></input></td>
                    <td><input class='obs' type='text' name='ob' value=''></input></td>
                </tr>
            </table>
            <input id='submit' type='submit' name='submit' value='Submit' />
        </form>
    </body>
</html>

我希望有人能为我阐明这件事。

终于,在一位老朋友的帮助下,我得到了我的问题的答案,我只是想分享给可能遇到同样问题的其他人。 提供的解决方案是 current() RecursiveIteratorIterator 函数中的 if 语句,它检查 parent::key 是否是您需要的,如果是PHP 会将 parent::current() 值分配给 $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>";
    }