Прежде всего ваш «массив» на самом деле является объектом.Вам нужно сначала преобразовать его в массив, чтобы использовать эту функцию.Вот функция, которая может сделать это:
function objectToArray($d) {
if (is_object($d)) {
// Gets the properties of the given object
$d = get_object_vars($d);
}
if (is_array($d)) {
/*
* Return array converted to object
* Using __FUNCTION__ (Magic constant)
* for recursive call
*/
return array_map(__FUNCTION__, $d);
}
else {
// Return array
return $d;
}
}
Очевидно, что это функция php, поместите ее в файл php или в плагин smarty, чтобы иметь к ней доступ.Затем, вот функция, которая использует предыдущую функцию для динамического взаимодействия с объектами или любым другим вводом.
function smarty_function_tree($params, &$smarty) {
if (!isset($params['level'])) {
$level = 0;
} else {
$level = $params['level'];
}
return tree($params['data'], $level);
}
function tree($data, $level) {
echo '<ul class="level', $level, '">', "\r\n";
$aData = objectToArray($data);
foreach ($aData as $key => $entry) {
if (is_array($entry)) {
echo '<li>', $key, '</li>', "\r\n";
tree($entry, $level+1);
} else {
echo '<li>', $key, ' = ', $entry, '</li>', "\r\n";
}
}
echo '</ul>', "\r\n";
}
Создайте плагин, вызываемый в соответствии с именем функции, затем вы можете использовать его в шаблоне, как этот:
{tree data=$yourObject}
или
{tree data=$yourArray}
Редактировать: вы также можете использовать маленький бит css для отступа в выводе функции дерева:
.level0 {
text-indent: 20px;
}
.level1 {
text-indent: 40px;
}
.level2 {
text-indent: 60px;
}
.level3 {
text-indent: 80px;
}
.level4 {
text-indent: 100px;
}
.level5 {
text-indent: 120px;
}
.level6 {
text-indent: 140px;
}
.level7 {
text-indent: 160px;
}
.level8 {
text-indent: 180px;
}
.level9 {
text-indent: 200px;
}
Надеюсь, это поможет!