编写优雅的PHP代码:清理不必要的循环和合并数组

时间:2013-06-15 02:56:07

标签: php arrays loops coding-style merge

我从六(6)个不同的textareas中提取输入,用\ r \ n作为分隔符爆炸数组,并循环遍历每组数据两次以替换它。

例如,我有textarea输入,人们可以在其中输入与列出的主色相似的颜色,因此标题为“Blue”的textarea的输入可能是Aqua\r\nRoyal Blue\r\nTeal

然后我有红色,橙色,黄色,绿色和紫色的输入框,数据类似。

我想用<span class="blue">Aqua</span>替换用户输入 - 在本例中为Aqua。蓝色框中的任何输入都包含在“蓝色”类中,class="red"中的红色等等。

我已经将这一切工作得很好,循环遍历每组数据两次:一个foreach循环找到文本,另一个创建替换文本,然后最后简单地使用preg_replace实际执行替换。

$find_blue     = explode ("\r\n", $blue);
$replace_blue  = explode ("\r\n", $blue);

$i = 0;
foreach($replace_blue AS &$html)
{
  $find_blue[$i] = trim($find_blue[$i]);
  $html = '<span class="blue">' . $find_blue[$i] . '</span>';
  $i++;
}
foreach($find_blue AS &$found)
{
  $found = preg_quote(htmlspecialchars($found));
  $found = '~\b('.$found.')\b)~i';
}

$output = preg_replace($find_blue, $replace_blue, $output);

这可以很好地运行,但我认为它是笨拙的代码,有12个循环(每种颜色2倍)都做同样的事情。我想编写更清晰,更有效,更强大的更好代码,我知道array_merge存在,但我不确定如何整合它或使所有内容连贯一致。

1 个答案:

答案 0 :(得分:1)

您可以创建一个处理字符串的函数,然后只需要设置数组的值。

类似:

<?php 
/**
 * key = colour to replace
 * value = data received from form
 */
$test_data_set = array(
'red'=>"Auburn\r\nBarn red",
'blue'=>"Aqua\r\nRoyal Blue\r\nTeal",
'green'=>"Amazon\r\nApple green\r\nArmy green",
);

//process
foreach($test_data_set as $color=>$input){
    $t = explode("\r\n",$input);
    array_walk($t, function(&$value, $key, $color){
        $value = '<span class="'.$color.'">' . trim($value) . '</span>';
    }, $color);
    $test_data_set[$color] = $t;
}

//debug
header('Content-Type: text/plain');
echo print_r($test_data_set,true);

/*  Result = $test_data_set
    Array
    (
        [red] => Array
            (
                [0] => <span class="red">Auburn</span>
                [1] => <span class="red">Barn red</span>
            )

        [blue] => Array
            (
                [0] => <span class="blue">Aqua</span>
                [1] => <span class="blue">Royal Blue</span>
                [2] => <span class="blue">Teal</span>
            )

        [green] => Array
            (
                [0] => <span class="green">Amazon</span>
                [1] => <span class="green">Apple green</span>
                [2] => <span class="green">Army green</span>
            )

    )
*/