0

6 つの異なるテキストエリアから入力を取得し、区切り文字として \r\n を使用して配列を展開し、データの各セットを 2 回ループして置換しています。

たとえば、リストされているメインの色に似た色を入力できるテキストエリア入力があるので、「青」というタイトルのテキストエリアの入力は次のようになります。Aqua\r\nRoyal Blue\r\nTeal

次に、赤、オレンジ、黄、緑、紫の入力ボックスに同様のデータを入力します。

ユーザー入力 (この例では Aqua) を に置き換えたいと思います<span class="blue">Aqua</span>。青いボックスに入力されたものはすべて 'blue' クラスにラップされ、赤から何かが にラップされますclass="red"

私はこれをすべてうまく機能させ、データの各セットを 2 回循環させました。

$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 が存在することは知っていますが、それを統合する方法や、すべてを一貫性とまとまりのあるものにする方法がわかりません。

4

1 に答える 1

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>
            )

    )
*/
于 2013-06-15T03:42:25.933 に答える