如何基于多维数组动态地将类添加到动态打印的ol?

时间:2016-03-29 04:43:54

标签: php html

这是来自Larry Ullman的“PHP高级和面向对象编程:Visual QuickPro指南(第3版)”的示例脚本。

我的问题是如何根据每个项目的嵌套方式动态添加html类。例如,我想在所有父任务中添加一个类任务,为所有子任务添加一个类子任务,为子任务的所有子任务添加一个子子任务,并且无论项目的嵌套方式如何,我都想动态。我对处理这样一个问题的任何方法持开放态度,这个特定的例子只是一个参考,因为我知道可能有更好的方法来解决这个问题,包括更改存储在数组中的信息。我想知道处理在ol中打印多维数组的一般方法,并添加一个动态指示嵌套每个项目的类,以便我可以独立地设置它们的样式。我真的很感激任何帮助,我每天都在学习。

FullScript

curarrayandoutput

    <?php
        //Enter your code here, enjoy!

$tasks = array(
    0 => array(
        1 => 'Task 1',
        2 => 'Task 2',
        3 => 'Task 3',
        8 => 'Task 4',
    ),
    2 => array(
        4 => 'Subtask 1',
        5 => 'Subtask 2',
        6 => 'Subtask 3',
    ),
    5 => array(
        7 => 'Subsubtask 1',
    ),
);

echo '<ol>';
printTasksRecursively($tasks, $tasks[0]);
echo '</ol>';

function printTasksRecursively($tasks, $tasksToBePrinted, $level = 0)
{

        echo '<ol class="';
        if($level > 0) {
            echo str_repeat('sub', $level);
            }
        echo 'task">';

       foreach ($tasksToBePrinted as $id => $taskName) {
         echo '<li>' . $taskName . '</li>';

       if (isset($tasks[$id])) {
            printTasksRecursively($tasks, $tasks[$id], $level + 1);
        }

        }

       echo '</ol>';


}





 <ol><ol class="task">
<li>Task 1</li>
<li>Task 2</li>
<ol class="subtask">
<li>Subtask 1</li>
<li>Subtask 2</li>
<ol class="subsubtask">
<li>Subsubtask 1</li>
</ol>
<li>Subtask 3</li>
</ol>
<li>Task 3</li>
<li>Task 4</li>
</ol></ol>

1 个答案:

答案 0 :(得分:0)

您可以使用递归函数:

$tasks = array(
    0 => array(
        1 => 'Task 1',
        2 => 'Task 2',
        3 => 'Task 3',
        8 => 'Task 4',
    ),
    2 => array(
        4 => 'Subtask 1',
        5 => 'Subtask 2',
        6 => 'Subtask 3',
    ),
    5 => array(
        7 => 'Subsubtask 1',
    ),
);

printTasksRecursively($tasks, $tasks[0]);

function printTasksRecursively($tasks, $tasksToBePrinted, $level = 0)
{
    echo '<ol' . ($level > 0 ? ' class="' . str_repeat('sub', $level) . 'task"' : '') . '>';

    foreach ($tasksToBePrinted as $id => $taskName) {
        echo "<li>$taskName</li>";

        if (isset($tasks[$id])) {
            printTasksRecursively($tasks, $tasks[$id], $level + 1);
        }
    }
    echo '</ol>';
}

输出结果为:

<ol>
    <li>Task 1</li>
    <li>Task 2</li>
    <ol class="subtask">
        <li>Subtask 1</li>
        <li>Subtask 2</li>
        <ol class="subsubtask">
            <li>Subsubtask 1</li>
        </ol>
        <li>Subtask 3</li>
    </ol>
    <li>Task 3</li>
    <li>Task 4</li>
 </ol>