3

好的 - 所以我正在创建一个动态 CSS 样式表,我想用一个数组来设置它。

首先让我说我不是 PHP 专家,但我对它有一定的了解。

这是我非常基本的数组。

$visual_css = array (
    array(
        "selector"  => "body",
        "property"  => "background",
        "value"     => "#FFF",
        "property2" => "color",
        "value2"    => "#000",
        "type"      => "css"
    )
);

所以我们有一个选择器和两个带值的属性。

我现在想创建样式表,但由于缺乏 PHP 知识,我遇到了问题。

foreach ($visual_css as $value) {
    switch ($value['type']) {
        case "css":

            // Open selector
            echo ( !empty($value['selector']) ? $value['selector'] . '{' : null );

            foreach ($value as $key => $item) {
                foreach ($value as $key2 => $item2) {
                    //Match only the id's against the key
                    if (preg_match('/^property/i', $key) && preg_match('/^value/i', $key2)) {
                        // First property
                        echo ( !empty($item) ? $item . ':' : null );
                            echo ( !empty($item2) ? $item2 . ';' : null );
                    }
                }

            }

            // Close selector
            echo ( !empty($value['selector']) ? '}' : null );

        break;
    }
}

现在我知道这段代码不正确,因为它在样式表中输出以下内容:

body{background:#FFF;background:#000;color:#FFF;color:#000;}

这是期望的结果:

body{background:#FFF;color:#000;}

所以基本上,我希望能够创建无限数量的属性和值,并在它们后面加上一个递增的数字,并让代码把它写出来。

谁能帮我?

谢谢!

4

2 回答 2

8

所以我的方法使用多维数组而不是平面数组将选择器的属性嵌套在子数组中。通过这种方式,您的方法更加简洁,首先循环遍历第一层,然后遍历每个父级的子级并为每个属性/值对组成 CSS。它还使迭代变得轻而易举,而不必检查键的值来定位您所在的对。如果你需要不同的输出格式,你的迭代代码可以决定,它应该被排除在结构之外

$visual_css = array (
    'body'  => array(
        'background'    => '#FFF',
        'color'         => '#000'
    )
);

$output = '';
foreach($visual_css as $k => $properties) {
    if(!count($properties))
        continue;

    $temporary_output = $k . ' {';

    $elements_added = 0;

    foreach($properties as $p => $v) {
        if(empty($v))
            continue;

        $elements_added++;

        $temporary_output .= $p . ': ' . $v . '; ';
    }

    $temporary_output .= "}\n";

    if($elements_added > 0)
        $output .= $temporary_output;
}

echo $output;
// body {background: #FFF; color: #000; }
于 2013-04-13T17:27:29.647 回答
1

在您的示例中,您在这段代码中循环了两次相同的数组:

foreach ($value as $key => $item) {
    foreach ($value as $key2 => $item2) {

如果您以更合乎逻辑的方式构建数据,您也可以制作更简洁的循环代码。我建议您将具有每个属性和值的数组构造为单独的子数组,例如:

$visual_css = array(
    array(
        'selector' => 'body',
        'properties' => array(
            'background' => '#fff',
            'color' => '#000'
        )
    )
    // ... etc ...
);

然后你可以像这样轻松地循环它:

foreach ($visual_css as $selector)
{
    echo $selector['selector'].' { ';
    foreach ($selector['properties'] as $name => $value)
    {
        echo $name.': '.$value.'; ';
    }
    echo ' } ';
}
于 2013-04-13T17:32:41.063 回答