PHP多维数组排列成HTML嵌套列表


PHP multidimentional array permutation into HTML nested list

我在这方面花了很多时间,但无法生成解决方案,所以我请求您的帮助:)我有一个这样结构的多维PHP数组:

Array
(
    [1] => Array
    (
        [title] => Dance Type
        [id] => 2
        [children] => Array
        (
             [0] => Tango
             [1] => Salsa
             [2] => Hip-Hop
        )
    )
    [2] => Array
    (
        [title] => Age
        [id] => 3
        [children] => Array
            (
                [0] => Young
                [1] => Teen
                [2] => Senior
            )
    )
    [3] => Array
    (
        [title] => Grade
        [id] => 1
        [children] => Array
            (
                [0] => Professional
                [1] => Student
            )
    )
    [4] => Array
    (
        [title] => Groups
        [id] => 4
        [children] => Array
            (
                [0] => Small Group
                [1] => Duet
            )
    )
)

此数组可能包含无限数量的键,而不一定是4个。

我需要的是生成以下结构(ul/li)的嵌套"时间表":

<ul>
    <li>Tango
    <ul>
        <li>Young
        <ul>
            <li>Professional
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
            <li>Student
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
        </ul>
        </li>
        <li>Teen
        <ul>
            <li>Professional
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
            <li>Student
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
        </ul>
        </li>
        <li>Senior
        <ul>
            <li>Professional
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
            <li>Student
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
        </ul>
        </li>
     </ul>
     </li>
    <li>Salsa
    <ul>
        <li>Young
        <ul>
            <li>Professional
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
            <li>Student
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
        </ul>
        </li>
        <li>Teen
        <ul>
            <li>Professional
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
            <li>Student
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
        </ul>
        </li>
        <li>Senior
        <ul>
            <li>Professional
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
            <li>Student
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
        </ul>
        </li>
     </ul>
     </li>
    <li>Hip-Hop
    <ul>
        <li>Young
        <ul>
            <li>Professional
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
            <li>Student
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
        </ul>
        </li>
        <li>Teen
        <ul>
            <li>Professional
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
            <li>Student
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
        </ul>
        </li>
        <li>Senior
        <ul>
            <li>Professional
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
            <li>Student
            <ul>
                <li>Small Group</li>
                <li>Duet</li>
            </ul>
            </li>
        </ul>
        </li>
     </ul>
     </li>
</ul>

提前感谢你们的帮助!

EDIT:此数组直接从MySQL数据库生成(使用一个表):事件注册例程类别表:

| categoriesID [int(10)] | categoryTitle [text]  | optionTitle [text]   |
------------------------------------------------------------------------
| 2                      | Dance Type            | Tango                |
------------------------------------------------------------------------
| 3                      | Age                   | Young                |
------------------------------------------------------------------------
| 1                      | Grade                 | Professional         |
------------------------------------------------------------------------
| 4                      | Groups                | Small Group          |
------------------------------------------------------------------------
| 2                      | Dance Type            | Salsa                |
------------------------------------------------------------------------
| 3                      | Age                   | Teen                 |
------------------------------------------------------------------------
| 1                      | Grade                 | Student              |
------------------------------------------------------------------------
| 4                      | Groups                | Duet                 |
------------------------------------------------------------------------
| 2                      | Dance Type            | Salsa                |
------------------------------------------------------------------------
| 3                      | Age                   | Senior               |
------------------------------------------------------------------------
| 2                      | Dance Type            | Hip-Hop              |
------------------------------------------------------------------------
etc...

$schedule = array();
$sSQL="SELECT DISTINCT(categoriesID), categoryTitle FROM eventsRegistrationRoutinesCategories WHERE eventsID = '".$eventsID."' ORDER BY eventsRegistrationRoutinesCategoriesID";
$result = mysqli_query($linkMySQL, $sSQL) or sqlError($sSQL,mysqli_error($linkMySQL));
$count1 = 1;
while($row = mysqli_fetch_array($result)) {
    $schedule[$count1]['title'] = $row['categoryTitle'];
    $schedule[$count1]['id'] = $row['categoriesID'];
    // Get all sub options for each
    $sSQL2="SELECT * FROM eventsRegistrationRoutinesCategories WHERE categoriesID = '".$row["categoriesID"]."' GROUP BY categoriesOptionsID ORDER BY eventsRegistrationRoutinesCategoriesID";
    $result2=mysqli_query($linkMySQL, $sSQL2) or sqlError($sSQL2,mysqli_error($linkMySQL));
    while($row2 = mysqli_fetch_array($result2)) {
        if(!empty($row2["optionTitle"])) {
            $schedule[$count1]['children'][] = $row2["optionTitle"];
        }
    }
    $count1++;
}

使用此。。希望这能帮助

$array=//Your input array
foreach($array as $row) {
    $result[$row['title']]=$row['children'];
}

echo '<ul>';
foreach($result['Dance Type'] as $dance_type) {
    echo '<li>'.$dance_type.'</li>';
    echo '<ul>';
    foreach($result['Age'] as $age) {
        echo '<li>'.$age.'</li>';
        echo '<ul>';
        foreach($result['Grade'] as $grade) {
            echo '<li>'.$grade.'</li>';
            echo '<ul>';
            foreach($result['Groups'] as $groups) {
                echo '<li>'.$groups.'</li>';
            }
            echo '</ul>';
        }
        echo '</ul>';
    }
    echo '</ul>';
}
echo '</ul>';

我已经解决了这个问题,如果有人需要,我会发布一个答案:)我已将我们的数组称为"$scheduleNested"。然后我创建了一个函数:

function buildTree($array, $depth) {
    global $scheduleNested;
    echo '<ul>';
    foreach($array as $row) {
        echo '<li>';
        echo $row;
        if(isset($scheduleNested[$depth+1])) {
            buildTree($scheduleNested[$depth+1]['children'], $depth+1);
        }
        echo '</li>';
    }
    echo '</ul>';
}

然后我们在div中调用这个函数:

<div class="dd" id="nestable2">
    <?
    buildTree($scheduleNested[1]['children'],1);
    ?>
</div>