#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, немного грязновато 😉