PHP : Получить выбор с ВЛОЖЕННОЙ группой опций и параметрами динамически по строкам

#php #nested #optgroup

Вопрос:

Начиная с массива строк, таких как :

 "mobili;tavolini_lato_divano",
"mobili;tavoli_da_pranzo",
"illuminazione;plafoniere",
"illuminazione;lampade_decorative",
"sculture;sculture_in_resina",
"sculture;sculture_in_resina;serie_limitata_tatoo",
"sculture;sculture_in_resina;sculture_resina_grandi",
 

Необходимо создать выборку , в которой есть вложенная опционная группа и опция ,на основе разделения на»;», где, если 2 элемента, первый ( родитель ) становится опционной группой, а второй ( сын) — опцией.

Если 3 элемента ( с одним и тем же 1-м элементом ) , 2-й элемент станет дополнительной группой (внутри первой вложенной группы ) с опцией внутри ( 3d-элемент ).

И так далее, если 4 элемента, и больше элементов.

На самом деле я сделал этот пример, но он работает только в том случае, если их 2.

Полный пример с вводом и выводом в :

https://wtools.io/php-sandbox/b63q

Выберите Выполнить и HTML в качестве вывода, чтобы увидеть результат.
Спасибо

Ответ №1:

Сначала создайте упорядоченный (и вложенный) массив массива элементов (строка 76-89 в моем коде), а затем вы должны использовать рекурсивную функцию (строка 91-104 в моем коде) для создания строки параметров и группы опций.

Наконец, выведите выходные данные рекурсивной функции (строка 107 в моем коде).

 <?php

/*
Row 1 : mobiletti_puzzle_3d;mobili
Output : "optgroup" -> mobiletti_puzzle_3d
            "option" -> mobili

Row 2 : sculture;sculture_in_resina
Output : "optgroup" -> sculture
            "option" -> sculture_in_resina

Row 3 : sculture;sculture_in_resina;sculture_resina_grandi
Output : "optgroup" -> sculture
            "optgroup" -> sculture_in_resina
                "option" -> sculture_resina_grandi

If they have the same parent must be added as Option of Row 2 

Row 4 : sculture;sculture_in_metallo
Output : "optgroup" -> sculture
            "option" -> sculture_in_metallo


Final Output ALL EXAMPLE :
"optgroup" -> mobiletti_puzzle_3d
    "option" -> mobili
"optgroup" -> sculture
    "option" -> sculture_in_resina
    "option" -> sculture_in_metallo
    "optgroup" -> sculture_in_resina
        "option" -> sculture_resina_grandi

Split by " ; " the count-1 , always will be an optgroup and this will generate a Nested Optgroup 

*/
$Categories = [
    "mobiletti_puzzle_3d;mobili",
    "mobili;sedie_da_pranzo",
    "mobili;sgabelli",
    "mobili;tavolini_da_salotto",
    "mobili;tavolini_lato_divano",
    "mobili;tavoli_da_pranzo",
    "sculture;sculture_decorate_in_vetro",
    "sculture;sculture_in_bronzo",
    "sculture;sculture_in_metallo",
    "sculture;sculture_in_resina;sculture_resina_grandi",
    "sculture;sculture_in_resina;sculture_resina_medie",
    "sculture;sculture_in_resina;sculture_resina_piccole",
    "sculture;sculture_in_resina;serie_limitata_tatoo",
    "illuminazione;plafoniere",
    "illuminazione;lampade_decorative",
    "illuminazione;lampade_da_terra",
    "illuminazione;lampade_da_tavolo",
    "illuminazione;lampade_da_comodino",
    "illuminazione;lampadari",
    "divani_e_poltrone;mobili",
    "decorazione_murale;stampe_su_telaio_estetico",
    "decorazione_murale;specchi_design_moderno",
    "decorazione_murale;quadri_scultura_in_metallo",
    "decorazione_murale;puzzle_3d_in_legno",
    "decorazione_murale;orologi_parete",
    "decorazione_murale;dipinti_su_telaio_estetico",
    "decorazione_murale;dipinti_su_plexiglas",
    "consolle;mobili",
    "colonne;mobili",
    "collage_3d;decorazione_murale",
    "appliques;illuminazione",
    "altri_oggetti;vasi",
    "altri_oggetti;posacenere",
    "altri_oggetti;portagioie",
    "altri_oggetti;portacandele",
    "altri_oggetti;oggetti_decorativi",
    "altri_oggetti;centrotavola"
];

$select = [];
foreach ($Categories as $row) {
    $pointer = amp;$select;
    $row = explode(';', $row);
    $ogCount = count($row) - 1;
    for ($i = 0; $i < $ogCount; $i  ) {
        $row[$i] = $row[$i];
        if (empty($pointer[$row[$i]]))
            $pointer[$row[$i]] = [];
        $pointer = amp;$pointer[$row[$i]];
        if (($i   1) >= $ogCount)
            $pointer[] = $row[$i   1];
    }
}

function recursiveSelect($_options, $_space = '')
{
    if (!is_array($_options))
        return  '<option value="' . $_options . '">' . $_options . '</option>' . "n";
    else {
        $tmp = '';
        foreach ($_options as $key => $option)
            if (!is_array($option)) {
                $tmp .= recursiveSelect($option);
            } else
                $tmp .= '<optgroup label="' . $_space . $key . '">' . recursiveSelect($option, $_space . str_repeat('amp;nbsp;', 4)) . '</optgroup>' . "n";
        return $tmp;
    }
}
?>
<select>
    <?php echo (recursiveSelect($select)); ?>
</select>
 

Этот код может обрабатывать все глубины вложенных элементов в вашем массиве.

Чтобы лучше отобразить выбранные группы опций, я добавил параметр space ($_space) в рекурсивную функцию (с 4 пробелами в строке 101).

Комментарии:

1. Действительно потрясающе ! последний вопрос … как насчет того, чтобы установить выбранный, если у меня есть значение по умолчанию, например «скульптура;скульптура_в_резина;скульптура_резина_гранди» ?

2. Два способа: 1 — Установите идентификатор для всех параметров по имени и установите выбранный по умолчанию параметр по js при загрузке страницы. 2 — В строке опции возврата рекурсивной функции Проверьте, является ли значение ($_options) опцией по умолчанию, добавьте атрибут с именем «выбранный».