Бесконечная сортировка массива дерева и генерация вложенной структуры HTML с использованием передовых методов - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу создать этот вопрос с намерением, чтобы мы могли собрать в одном месте один или несколько примеров бесконечного дерева массивов и сгенерировать вложенную структуру HTML <ul> <li> с примерами кодов, использующих передовой опыт для младших классов.программисты, которые хотят научиться работать с массивами этого типа.

Область применения:

  • Сортировать расположение и генерировать HTML с различными типами примеров
  • Используйте различные примеры кодов с одинаковым результатом, чтобы понять работу с такими типами устройств, которые могут стать очень сложными.

Я подготовил для этого примерамногоуровневое расположение:

Код, который заказывает это расположение, я получил из этого ответа: сортировка массива php

Простое представлениекод, который не так легко переварить, я хотел бы, чтобы более опытные программисты дали нам больше примеров кода для получения того же результата, с различными практиками иd примеров.

$data = array(
    array("id"=> 1,  "parent_id" => "", "name"=> "Home" ),
    array("id"=> 2,  "parent_id" => "", "name"=> "News"),
    array("id"=> 3,  "parent_id" => 2, "name"=> "World"),
    array("id"=> 4,  "parent_id" => 2, "name"=> "Internationals"),
    array("id"=> 5,  "parent_id" => 4, "name"=> "America"),
    array("id"=> 6,  "parent_id" => 5, "name"=> "United Stated"),
    array("id"=> 7,  "parent_id" => 6, "name"=> "Florida"),
    array("id"=> 8,  "parent_id" => 7, "name"=> "Miami"),
    array("id"=> 9,  "parent_id" => "", "name"=> "Sports"),
    array("id"=> 10,  "parent_id" => "", "name"=> "Global")
);

$sort = array();
$all = array();
$dangling = array();

// Initialize arrays
foreach ($data as $value) {
    $value['children'] = array();
    $id = $value['id'];

    // If this is a top-level node, add it to the sort immediately
    if ($value['parent_id'] == '') {
        $all[$id] = $value;
        $sort[] =& $all[$id];

    // If this isn't a top-level node, we have to process it later
    } else {
        $dangling[$id] = $value; 
    }
}

// Process all 'dangling' nodes
while (count($dangling) > 0) {
    foreach($dangling as $value) {
        $id = $value['id'];
        $pid = $value['parent_id'];

        // If the parent has already been added to the sort, it's
        // safe to add this node too
        if (isset($all[$pid])) {
            $all[$id] = $value;
            $all[$pid]['children'][] =& $all[$id]; 
            unset($dangling[$value['id']]);
        }
    }
}

echo "<pre>"; print_r($sort);

Это будет результат упорядоченного массива:

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 
            [name] => Home
            [children] => Array
                (
                )

        )

    [1] => Array
        (
            [id] => 2
            [parent_id] => 
            [name] => News
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [parent_id] => 2
                            [name] => World
                            [children] => Array
                                (
                                )

                        )

                    [1] => Array
                        (
                            [id] => 4
                            [parent_id] => 2
                            [name] => Internationals
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 5
                                            [parent_id] => 4
                                            [name] => America
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 6
                                                            [parent_id] => 5
                                                            [name] => United Stated
                                                            [children] => Array
                                                                (
                                                                    [0] => Array
                                                                        (
                                                                            [id] => 7
                                                                            [parent_id] => 6
                                                                            [name] => Florida
                                                                            [children] => Array
                                                                                (
                                                                                    [0] => Array
                                                                                        (
                                                                                            [id] => 8
                                                                                            [parent_id] => 7
                                                                                            [name] => Miami
                                                                                            [children] => Array
                                                                                                (
                                                                                                )

                                                                                        )

                                                                                )

                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

    [2] => Array
        (
            [id] => 9
            [parent_id] => 
            [name] => Sports
            [children] => Array
                (
                )

        )

    [3] => Array
        (
            [id] => 10
            [parent_id] => 
            [name] => Global
            [children] => Array
                (
                )

        )

)

Я хочу создать из этого массиваHTML-структура, подобная следующей, с использованием передовых методов и с различными примерами.

<ul>
    <li><a href="#">Home</a></li>
    <li><a href="#">News</a>
        <ul>
            <li><a href="#">World</a></li>
            <li><a href="#">Internationals</a>
                <ul>
                    <li><a href="#">America</a>
                        <ul>
                            <li><a href="#">United Stated</a>
                                <ul>
                                    <li><a href="#">Florida</a>
                                        <ul>
                                            <li><a href="#">Miami</a></li>
                                        </ul>
                                    </li>
                                </ul>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="#">Sports</a></li>
    <li><a href="#">Global</a></li>
</ul>

1 Ответ

0 голосов
/ 24 февраля 2019

Если бы кто-нибудь мог сказать, что является хорошей практикой для этого, не было бы необходимости писать это разными способами.:)

Наивно написано, что это будет функция рекурсии с линейно увеличивающимся уровнем отступа:

function getListHtml( $input, $indentLevel = 0 ) {

    if ( empty( $input ) ) {
        return '';
    }

    $output = '';
    $indent = str_repeat( "\t", $indentLevel * 2 );

    $output .= $indent . "<ul>\n";

    foreach ( $input as $item ) {
        $name   = htmlspecialchars( $item['name'] );
        $output .= $indent . "\t<li><a href='#'>{$name}</a>";

        $children = getListHtml( $item['children'], $indentLevel + 1 );
        $output   .= $children ? "\n{$children}{$indent}\t" : '';

        $output .= "</li>\n";
    }

    $output .= $indent . "</ul>\n";

    return $output;
}

$result = getListHtml( $sort );

Хорошая практика в более конкретных случаях скорее всего будет следовать шаблонным потребностям проекта, чем частным данным PHPкод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...