Замена подстроки значениями из массива в PHP - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь написать файл JSON с использованием массивов. Первоначально файл использовался для создания файла colorbook.js на сервере, а затем вручную находил и заменял все значения в нем. Это код:

<?php
$colorsperpage = 48; // format is 6 columns by 8 rows
$letters = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K');
$hexValues = array('ECECEC', 'D9D9D9', 'C7C7C7', 'B4B4B4', 'A2A2A2');

$txt = "var color = {\r\n";

for ($i = 0 ; $i < count($letters) ; $i++){
    $pagenum = $i + 1;
    for ( $j = 1; $j <= $colorsperpage; $j++ ){
        if ($j < 10){
            if ($j == $colorsperpage){
                $txt .= "\t\"" . $letters[$i] . $pagenum . "-" . "0" . $j . "\"  :  \"rgba(255,255,255,1)\"\r\n";
            } else {
                $txt .= "\t\"" . $letters[$i] . $pagenum . "-" . "0" . $j . "\"  :  \"rgba(255,255,255,1)\",\r\n";
            }
        } else {
            if ($j == $colorsperpage){
                $txt .= "\t\"" . $letters[$i] . $pagenum . "-" . $j . "\"  :  \"rgba(255,255,255,1)\"\r\n";
            } else {
                $txt .= "\t\"" . $letters[$i] . $pagenum . "-" . $j . "\"  :  \"rgba(255,255,255,1)\",\r\n";
            }

        }
    }
};


$txt .= "};";

foreach ($hexValues as $hex){
    $txt = preg_replace('/rgba(255,255,255,1)/', $hex, $txt, 1);
}
$jsonFile = fopen('colorbook.js', 'w') or die('Unable to open file!');
fwrite($jsonFile, $txt);
fclose($jsonFile);
?>

Оригинальный скрипт правильно записал файл (если вы удалили цикл foreach). Я предполагал, что запуск preg_replace будет проходить через эту строку и заменять шестнадцатеричные значения по одному. Обратите внимание, что исходный массив состоит из 528 элементов; Я сократил это ради размещения здесь. Один для каждой записи RGBA. Может ли кто-нибудь дать мне знать, что я делаю не так? Спасибо.

1 Ответ

1 голос
/ 12 мая 2019

Не создавайте JSON вручную. Постройте массив в цикле и используйте json_encode() для окончательного результата. Вы можете получить шестнадцатеричные коды из массива во время цикла, а не делать сотни замен строк после этого.

А для форматирования ключей массива вы можете использовать sprintf(), чтобы объединить все части и дать начальный ноль $j.

<?php
$result = [];
$color_index = 0;
foreach ($letters as $i => $letter) {
    $pagenum = $i + 1;
    for ($j = 1; $j <= $colorsperpage; $j++) {
        $key = sprintf("%s%d-%02d", $letter, $pagenum, $j);
        $colorcode = $hexValues[$color_index++];
        $result[$key] = $colorcode;
    }
}
file_put_contents("colorbook.js", "var color = " . json_encode($result));
...