php: синтаксический анализ и преобразование структуры массива

#php #arrays

#php #массивы

Вопрос:

Мне нужно преобразовать одну структуру массива в другую структуру массива.

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

Структура, с которой мы начинаем, выглядит следующим образом:

 $cssoptions = array(

    array(
        'group'     => 'Measurements'
    ,   'selector'  => '#content'
    ,   'rule'      => 'width'
    ,   'value'     => '200px'
    ) // end data set

,   array(
        'group'     => 'Measurements'
    ,   'selector'  => '#content'
    ,   'rule'      => 'margin-right'
    ,   'value'     => '20px'
    ) // end data set

,   array(
        'group'     => 'Colors'
    ,   'selector'  => '#content'
    ,   'rule'      => 'color'
    ,   'value'     => '#444'
    ) // end data set

,   array(
        'group'     => 'Measurements'
    ,   'selector'  => '.sidebar'
    ,   'rule'      => 'margin-top'
    ,   'value'     => '10px'
    ) // end data set

); // END $cssoptions
  

Это набор отдельных наборов данных, каждый из которых состоит из массива, содержащего две пары ключ => значение, описывающие «css-правило» и «css-правило-значение».

Кроме того, каждый набор данных содержит пару ключ => значение, описывающую «css-selector-group», к которой должно соответствовать «css-правило», и пару ключ => значение, описывающую «rule-group», которая должна использоваться для структурирования рендеринга конечного css в аккуратный блок кода css, упорядоченный по типу свойств, которые они описывают (цвета, размеры, типографика и т.д.)

Теперь мне нужно разобрать это и преобразовать в новую структуру, где:

     'rule'  => 'rule-name'
,   'value' => 'value-string'
  

для каждого набора данных преобразуется в:

 'rule-name' => 'value-string'
  

.. и затем помещается в новую структуру массива, где все пары ‘rule-name’ => ‘value-string’ должны быть объединены под соответствующими ‘selector-values’ следующим образом:

 '#content' => array(

    'width' => '200px'
,   'margin-right' => '20px'            

) // end selecor block
  

.. и, наконец, все эти блоки должны быть сгруппированы в соответствующие «группы стилей», создавая конечную результирующую структуру массива, подобную этой:

 $css => array(

    'Measurements' => array(

        '#content' => array(

            'width' => '200px'
        ,   'margin-right' => '20px'            

        ) // end selecor block


    ,   '.sidebar' => array(

            'margin-top' => '10px'

        ) // end selector block

    ) // end rule group


,   'Colors' => array(

        '#content' => array(

            'color' => '#444'

        ) // end selector block

    ) // end rule group

); // end css
  

Ответ №1:

Это не чистый и протестированный код, но что-то вроде этого должно выполнить эту работу:

 $css = array();    
foreach($cssoptions as $cssoption)
{
    $css[$cssoption['group']][$cssoption['selector']][$cssoption['rule']] = $cssoption['value'];
}
  

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

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

1. Элегантно, мне нужно привыкнуть к тому, что все не так сложно. Мне не нужно указывать больше значений одной и той же комбинации группа селектор правило, так что это сделает свое дело. Большое спасибо.

2. что вы имеете в виду, это не чисто и не протестировано, это выглядит супер чисто, как это может быть более кратким? .. и это работает 🙂 Для меня этого достаточно.

3. Я не тестировал, поэтому он не был протестирован (он может содержать некоторую синтаксическую ошибку). И я думаю, что почти все, что вы пишете на PHP, немного грязновато 😉