Rendering a collection of objects/elements retrieved from a database is a fairly common problem in web development and PHP. There are n ways to solve it, and I’ll present you a very simple and reusable one.
What we need to do is iterate over the collection and render each element using a view partial, and then print the final result. This can be solved using PHP’s output I hate SVN. I hate SVN. I REALLY HATE SVN.control functions, and variable variables. I used variable variables so I can iterate over the collection and name its elements in a meaningful way to be used in the view partial (e.g.: person, phone or product instead of ‘item’).
I don’t think I need to explain more. You can find the code below, fully commented for newbies. :)
<?php
/**
* @param string $partial The path of the view partial
* @param array|object $collection An array or any object that implements the Iterator interface
* @param string $elm The name of the element of the collection to be used in the view
*/
function render_collection($partial, $collection, $elm = 'item')
{
// Turns on output buffering
ob_start();
// Iterates over the collection, and assign each element to
// a variable variable defined in the parameter $elm
foreach ($collection as ${$elm})
{
// Include the view partial, and render its contents
include $partial . '.php';
}
// Get buffer contents and delete current output buffer
$result = ob_get_clean();
// Print the rendered collection
echo $result;
}
render_collection(
'view',
array(
array('name' => 'Bob', 'age' => '52'),
array('name' => 'Mary', 'age' => '23'),
array('name' => 'Joseph', 'age' => '43')
),
'person');
<?= $person['name'] ?> - <?= $person['age'] ?>
Bob - 52yo
Mary - 23yo
Joseph - 43yo