cbone
@cbone
Серверная инфраструктура

Десятимерный массив из строки (JS)

Всем привет. Задача следующая: на сайте есть приборы, которые могут быть в разных исполнениях. Например прибор «ЭНИ-701» может быть 2-х канальным, 4-х канальным, 8-ми канальным. В свою очередь 2-х канальный ЭНИ-701 может быть на 10 Вт, 20 Вт. 4-х канальный на 10, 20, 30 Вт. И так далее. Для простоты восприятия:
cacoo.com/diagrams/v2Qko8L4XGhYKh22
Конфигурация данного прибора задаётся в следующем виде:

var str = "ЭНИ-601[2к[10Вт;20Вт];4к[10Вт;20Вт;30Вт];8к[70Вт;80Вт]];"

Вложенность может быть ещё больше (то есть ЭНИ-601, 2-к, 10Вт могут быть ещё в разных исполнениях). максимальное число вложенностей достигает 10.

Вопрос заключается в следующем: Как обработать данную строку чтобы получить массивы с элементами:

arr[0] == "Эни-601";

arr[0][0] == "2к";
arr[0][1] == "4к";
arr[0][2] == "8к";

arr[0][0][0] == "10Вт";
arr[0][0][1] == "20Вт";

arr[0][1][0] == "10Вт";
arr[0][1][1] == "20Вт";
arr[0][1][2] == "30Вт";

arr[0][2][0] == "70Вт";
arr[0][2][1] == "80Вт";


Как можно подобное реализовать? Может я вообще думаю в неправильном направлении и есть менее извращённый способ?
  • Вопрос задан
  • 7633 просмотра
Решения вопроса 1
ninacarrot
@ninacarrot
Мне кажется, что вы нас обманываете. Для вашей задачи нужен не десятимерный массив, а дерево. Если вам действительно нужен десятимерный массив, то вы, вероятно, на самом деле занимаетесь теорией струн.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
iStyx
@iStyx
Just proof of concept:

<?php

$str = "ЭНИ-601[2к[10Вт;20Вт];4к[10Вт;20Вт;30Вт];8к[70Вт;80Вт]];";

$str = preg_replace("#([а-яА-Я\d\-]+)#u","\"\$1\"",$str);
$str = str_replace(array("[","]"),array(":{","}"),$str);
$str = preg_replace("#\{([^{};]+?(;[^}]+?)*?)\}#u","[\$1]",$str);
$str = str_replace(";",",",$str);
$str = '{'.substr($str,0,-1).'}';

print_r(json_decode($str,true));
echo PHP_EOL;



Array
(
    [ЭНИ-601] => Array
        (
            [2к] => Array
                (
                    [0] => 10Вт
                    [1] => 20Вт
                )

            [4к] => Array
                (
                    [0] => 10Вт
                    [1] => 20Вт
                    [2] => 30Вт
                )

            [8к] => Array
                (
                    [0] => 70Вт
                    [1] => 80Вт
                )

        )
)
Ответ написан
GavriKos
@GavriKos
Реализовать удобнее деревом. Корень — ЭНИ-601, от него три ветки 2к, 4к, 8к, от каждого из них — ваттность. Либо второй вариант — отдельно хранить варианты ватности, отельно 2к...8к, отдельно названия и потом все указателями сводить. Но вариант с деревом универсальнее
Ответ написан
Ogra
@Ogra
Ваша структура не реализуема в принципе. Вам нужно дерево.
Ответ написан
difiso
@difiso
В параллельной вселенной я космонавт
Первое что на ум приходит — рекурсия по уровням вложенности. Вход — "[", выход — "]", итерация цикла после ";"
Ответ написан
cbone
@cbone Автор вопроса
Серверная инфраструктура
Почему не реализуема? И как реализовывать дерево? Если можно ссылку на пример, буду очень благодарен.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы