php - 用PHP中数组中的值替换子字符串
问题描述
我正在尝试使用数组编写 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 条目一个。有人可以让我知道我做错了什么吗?谢谢。
解决方案
不要手动创建 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));
推荐阅读
- mongodb - Quarkus mongodb 和 oraccle 在同一个项目中
- reactjs - 如何在我的应用程序中每个获取请求的开头添加一个 URL?
- date - 多重排序(带日期)在 SPARQL 的内部查询中不起作用?
- php - PHP 使用 SSL 证书连接到 restAPI
- php - 计数从 PHP 中的大型 mysql 查询返回的 Int 值的出现次数
- vscode-extensions - 为 vscode 扩展实现 DocumentHighlightProvider 有什么意义
- android-jetpack-compose - 在水平寻呼机中保持列表状态 - Jetpack Compose
- javascript - 如何检测window.open
- java - 如何使用 Swagger Core (springdoc-openapi) 生成 OpenAPI 任意类型?
- python - 在 Python 中复制 R 解决方案以计算每月 CRR