0

I am generating a dynamic HTML table based on my DATABASE using the PHP RecursiveIteratorIterator function like this:

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

The following foreach loop generates each new row and passes the data to the iterator above.

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

I execute the PDO prepared $stmt where the first value I pull from the database is always the ID of the row.

All this works just great. Now, the problem I have is that I want to generate an HTML name parameter on each <td> element in the current() function of the iterator. And I need this name parameter to be always the first key of the current RecursiveIteratorIterator cycle (which in my case would be the ID column value for each row).

Something like this, so I can have the ID of the row in each of its <td> elements:

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

EDIT: The whole code

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;

EDIT: The example table that I would like to have generated:

<!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>

I hope someone can shed some light for me on this matter.

6
  • And RecursiveIteratorIterator::key() doesn't work? Commented Jun 5, 2016 at 13:36
  • It works, but it returns the name of the column for each value :/ . I need it to be always the first key of the current cycle. Commented Jun 5, 2016 at 13:46
  • I did the test like this: function current() { return "<td name='".RecursiveIteratorIterator::key()."'>".parent::current()."</td>"; } Commented Jun 5, 2016 at 13:47
  • Ok could you please supplement your question with an example of your query result, which is an associative array I presume. And second a generated HTML example which will display the results when the class TableRows generates its <tr><td>...</td></tr> output? That would be great to understand your expected results .. Commented Jun 5, 2016 at 17:14
  • @dbf Please could you tell what do you mean/need as the query result. I mean, do you need a var_dump(); or maybe a print_r(); of the array? And yes, as far as I can tell it is associative. However, you can check as I updated the code in my question! Commented Jun 5, 2016 at 18:14

1 Answer 1

1

Finally, with the help from a good old friend, I have the answer for my question and I just wanted to share it for anyone else that may encounter the same problem. The provided solution is an if statement into the current() RecursiveIteratorIterator function, which checks if the parent::key is the one you need, and if it is PHP will assign the parent::current() value to $this->id. This way you can fetch the values later in the return function, like in the sample code below.

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>";
    }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.