3

我将基本 CSS 设置存储在数据库中,以便客户端可以使用某种 Web 表单对其进行配置,然后这些设置可以在style标签中回显并覆盖任何现有设置。字体系列,背景颜色,字体颜色等基本设置。

桌子:

存储在表中的 CSS 设置

我决定存储如上所示的设置,而不是为每个 css 选择器设置列名,因为这样更容易更新和维护。

我试图回显“style_name”,然后是“{”,然后是每个“style_value”,然后是一个结束标签“}”。我快到了,但我试图弄清楚如何知道与样式名称关联的所有样式值何时已回显,然后回显一个结束标记,而不是在每个值之后。

PHP代码:

$sql = 'SELECT style_name, style_value FROM style ORDER BY style_name';
$results = $stmt->fetchAll(PDO::FETCH_OBJ);

$unique_css = array();

foreach ($results as $css) {
    if (!in_array($css->style_name, $unique_css))  {
        $unique_css[] = $css->style_name;
        echo $css->style_name . " { " . $css->style_value;
    } else {
        echo $css->style_value;
    }
    echo '}';
}

回报:

body {
    background: #CCC; }
    font-family: 'Verdana', sans-serif; }
    font-size: 40px; }
    text-align:center;
}

h1 {
    font-size: 50px;
}

h2 {
    font-family: 'Arial', sans-serif;
}

我知道我可以用值来回显每个样式名称,例如:

body { value1 } body {value2}

但我认为这只是 IMO 的混乱。帮助表示赞赏!

4

6 回答 6

4

最好的解决方案之一是使用正确的 MySQL 通过使用GROUP_BY关键字并将样式值字符串与以下内容连接来按样式名称分组GROUP_CONCAT

SELECT style_name, GROUP_CONCAT(style_value SEPARATOR ' ') style_values FROM style GROUP BY style_name

这将导致:

STYLE_NAME  STYLE_VALUES
body        background: #CCC; font-family: 'Verdana', sans-serif; font-size: 40px; text-align: center;
h1          font-size: 50px;
h2          font-family: 'Arial', sans-serif;

小提琴示例:

演示

有关 GROUP_BY 和 GROUP_CONCAT 的更多信息:http: //dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

之后,您可以以简单的方式将所有样式放在一起:

foreach ($results as $css) {
    echo $css->style_name . " { " . $css->style_values + " }";
}
于 2013-09-25T07:52:30.633 回答
2

只需使用这个:

$sql = 'SELECT style_name, style_value FROM style ORDER BY style_name';
$results = $stmt->fetchAll(PDO::FETCH_OBJ);

$map = array();

foreach ($results as $css) {
    $map[$css->style_name] .= $css->style_value;
}

foreach ($map as $style_name => $style_value) {
    echo $style_name . "{" . $style_value . "}" ;
}
于 2013-09-25T07:52:07.090 回答
0

如果你使用 $unique_css[],你在这个数组中有每个元素(body、h1、h2 等)。

您可以删除所有括号

str_replace("}", "", $unique_css[index]);

并添加结束括号

$unique_css[index] .= "}";

您可以循环在数组的每个索引中添加这些操作

于 2013-09-25T07:44:13.127 回答
0

您可能想先看一下解析数据。可能不是最有效的方法,但它可能会给你最大的灵活性。

这是未经测试的,但你应该得到一般的想法:

$uniqueStyles = array();

// Parsing the styles from the database.
foreach ($results as $cssRecord) {
    if (array_key_exists($cssRecord['style_name'], $uniqueStyles)) {
        $uniqueStyles[$cssRecord['style_name']][] = $cssRecord['style_value'];
    } else {
        $uniqueStyles[$cssRecord['style_name']] = array($cssRecord['style_value']);
    }
}

// To echo out the styles.
foreach ($uniqueStyles as $styleName => $styles) {
    echo $style . '{' . PHP_EOL;
    echo implode(PHP_EOL, $styles);
    echo '}' . PHP_EOL;
}
于 2013-09-25T07:51:18.843 回答
0

第一种方法

$sql = 'SELECT style_name, style_value FROM style ORDER BY style_name';
$results = $stmt->fetchAll(PDO::FETCH_OBJ);

$unique_css = array();

foreach ($results as $css) $unique_css[$css->style_name][] = $css->style_value;

foreach ($unique_css as $selector => $selector_styles) {
    echo $selector . ' {';
    foreach ($selector_styles as $style) {
        echo $style;
    }
    echo '}';
}
于 2013-09-25T07:54:05.053 回答
0

我会按标签名称对您的结果进行分组,然后从那里分解样式。

<?php
$sql = "SELECT style_id, style_name, style_value FROM style";
$res = $db->query($sql);

$styles = array();

while ($row = $res->fetchObject()) {
    $selector = $row->style_name;
    if (!isset($styles[$selector])) {
        $styles[$selector] = array();
    }
    $styles[$selector][] = $row->style_value;
}

foreach ($styles as $selector => $values) {
    echo sprintf('%s { %s }', $selector, implode('; ', $values));
}

显然,这只是一个粗略的实现,不应该逐字使用,但应该指出你正确的道路。

于 2013-09-25T07:58:40.707 回答