如何将嵌套的PHP数组转换为CSS规则?(代码示例)

应用程序的许多方面都可以自动化,例我们可以使用某些PHP代码(如使用数组)来生成样式表。那么如何实现?下面本篇文章就来带大家了解一下如何将嵌套的PHP数组转换为CSS规则,并以字符串的形式显示,希望对大家有所帮助。

下面我们就来看看将嵌套的关联数组转换为CSS字符的方法。

1、编写关联数组转换为css字符串的函数

要在PHP中将数组转换为CSS字符串(在SASS或LESS的情况下使用规则或简单变量),我们将使用以下函数:

  1. <?php
  2. /**
  3. * @param array $rules
  4. * CSS规则的数组形式为:
  5. * array('selector'=>array('property' => 'value')).
  6. * 还支持选择器
  7. * 嵌套示例:
  8. * array('selector' => array('selector'=>array('property' => 'value'))).
  9. *
  10. * @return 字符串一个CSS规则字符串。它不包含在<style>标签中。
  11. */
  12. function css_array_to_css($rules, $indent = 0) {
  13. $css = '';
  14. $prefix = str_repeat(' ', $indent);
  15. foreach ($rules as $key => $value) {
  16. if (is_array($value)) {
  17. $selector = $key;
  18. $properties = $value;
  19. $css .= $prefix . "$selector {\n";
  20. $css .= $prefix . css_array_to_css($properties, $indent + 1);
  21. $css .= $prefix . "}\n";
  22. } else {
  23. $property = $key;
  24. $css .= $prefix . "$property: $value;\n";
  25. }
  26. }
  27. return $css;
  28. }
  29. //调用css_array_to_css()函数转换
  30. //code
  31. ?>

说明:该函数基本上期望作为第一个参数包含CSS的规则或简单属性的数组,其中不是数组的每个key =>value;都将表示为key : value;,如果键的值是数组,则规则为css将被引入。

2、使用函数

正如上述函数说明中所提到的,它从具有指定规则的数组中返回一个CSS字符串。只要数组的结构有效,该函数就可以正常用于纯CSS规则,媒体查询,SASS和LESS。例如:

● 转换为CSS:

在 css_array_to_css()函数后添加以下代码:

  1. $stylesheet = array(
  2. "body" => array(
  3. "margin" => "0",
  4. "font-size" => "1rem",
  5. "font-weight" => 400,
  6. "line-height" => 1.5,
  7. "color" => "#212529",
  8. "text-align" => "left",
  9. "background-color" => "#fff"
  10. ),
  11. ".form-control" => array(
  12. "display" => "block",
  13. "width" => "100%!important",
  14. "font-size" => "1em",
  15. "background-color" => "#fff",
  16. "border-radius" => ".25rem"
  17. )
  18. );
  19. echo(css_array_to_css($stylesheet));

上一个代码段将输出以下CSS规则:

  1. body {
  2. margin: 0;
  3. font-size: 1rem;
  4. font-weight: 400;
  5. line-height: 1.5;
  6. color: #212529;
  7. text-align: left;
  8. background-color: #fff;
  9. }
  10. .form-control {
  11. display: block;
  12. width: 100%!important;
  13. font-size: 1em;
  14. background-color: #fff;
  15. border-radius: .25rem;
  16. }

● 转换为SASS / SCSS:

由于递归实现,将能够在规则中嵌套多个规则,这允许我们为SASS生成有效的语法:

  1. $sass = array(
  2. "nav" => array(
  3. "ul" => array(
  4. "margin" => 0,
  5. "padding" => 0,
  6. "list-style" => "none"
  7. ),
  8. "li" => array(
  9. "display" => "inline-block"
  10. ),
  11. "a" => array(
  12. "display" => "block",
  13. "padding" => "6px 12px",
  14. "text-decoration" => "none"
  15. )
  16. )
  17. );
  18. echo css_array_to_css($sass);

上一个代码段将输出以下SASS代码:

  1. nav {
  2. ul {
  3. margin: 0;
  4. padding: 0;
  5. list-style: none;
  6. }
  7. li {
  8. display: inline-block;
  9. }
  10. a {
  11. display: block;
  12. padding: 6px 12px;
  13. text-decoration: none;
  14. }
  15. }

● 转换为LESS:

与SASS的工作方式相同,我们也可以使用LESS编写复杂的规则:

  1. $less = array(
  2. "@nice-blue" => "#5B83AD",
  3. "@light-blue" => "@nice-blue + #111",
  4. "#header" => array(
  5. "color" => "@light-blue"
  6. ),
  7. ".component" => array(
  8. "width" => "300px",
  9. "@media (min-width: 768px)" => array(
  10. "width" => "600px",
  11. "@media (min-resolution: 192dpi)" => array(
  12. "background-image" => "url(/img/retina2x.png)"
  13. )
  14. ),
  15. "@media (min-width: 1280px)" => array(
  16. "width" => "800px"
  17. )
  18. )
  19. );
  20. echo css_array_to_css($less);

上一个代码段将输出以下LESS代码:

  1. @nice-blue: #5B83AD;
  2. @light-blue: @nice-blue + #111;
  3. #header {
  4. color: @light-blue;
  5. }
  6. .component {
  7. width: 300px;
  8. @media (min-width: 768px) {
  9. width: 600px;
  10. @media (min-resolution: 192dpi) {
  11. background-image: url(/img/retina2x.png);
  12. }
  13. }
  14. @media (min-width: 1280px) {
  15. width: 800px;
  16. }
  17. }