我试图在放入另一个文件之前编辑数组中的第一个条目。
就是这样:
(["\"NAMES\":\"cs.js\"},[
我想把它变成这个:
([{"NAMES":"cs.js"},[
我使用的是在线正则表达式生成器,但到目前为止,我只能使用/. [" [/] /并用([{:替换)来编辑到这一点p>
([{"NAMES\":\"cs.js\"},[
任何帮助都将不胜感激。
编辑:
以下是一些代码:
var initialCourseArray = new Array()
initialCourseArray.push(["\"NAMES\":\"cs.js\"},[
{"COURSE_ID":"ENGL 1013"},
{"COURSE_ID":"FAH1"},
{"COURSE_ID":"USHG1"},
{"COURSE_ID":"TECH 1001"},
{"COURSE_ID":"COMS 1403"},
{"COURSE_ID":"COMS 1411"},
{"COURSE_ID":"ENGL 1023"},
{"COURSE_ID":"SS1"},
{"COURSE_ID":"MATH 2914"},
之后的东西是数组中的其余值,它们看起来不像这个,所以我并不担心它们。
第二次编辑:
由于我真的应该首先放在这里的代码存在一些混淆,我使用php文件从测试数据库中检索课程数据,然后将其编码为JSON,格式化它,然后使用fopen和fprintf将其放在javascript文件中。我给你的部分是最终在javascript文件中的内容。
第三次编辑:
这是我用来格式化数组的代码。它非常混乱,因为我的领导者不断改变他希望结果的格式:
$row1 = "\"NAMES\"";
$colon = ":";
$row2 = "\"".$major.".js\"";
$major_name = $row1.$colon.$row2;
//The course data is already loaded into the table. This why I am using array_unshift to place the major_name inside.
array_unshift($major_array, $major_name);
array_push($major_array, "false");
$json_string = json_encode($major_array);
$re = "/.,/";
$subst = "},\r\n";
$json_string = preg_replace($re, $subst, $json_string);
$re2 = "/\,(?=[^.]*$)/";
$subst2 = ",[";
$json_string = preg_replace($re2, $subst2, $json_string, 1);
$first_string = "var initialCourseArray = new Array()";
$second_string = "initialCourseArray.push(";
$end_bracket = "]";
$end_parentheses =")";
答案 0 :(得分:1)
如果您只想将其应用于该行,
找到 void
,替换 /"?\\"/
即可。
答案 1 :(得分:1)
有几个问题:
您永远不应该操纵由json_encode
导致的字符串,因为您很可能会使JSON文本无效,这实际上是在您的情况下发生的。
所以使用这种陈述:
$json_string = preg_replace($re, $subst, $json_string);
正在寻找麻烦。获得$json_string
后,它应该是最终的。您希望在结构中发生任何事情必须在致电json_encode
之前发生。
即使您只想在JSON字符串中添加换行符,也不要这样做。 json_code
提供“漂亮的打印”选项,可以为您完成:
json_encode(...., JSON_PRETTY_PRINT);
第二个问题是,在JavaScript中你不能拥有像
这样的东西["NAMES":"cs.js" ...]
所以json_encode
永远不会产生类似的东西。如果您想在JavaScript中使用命名键(如"NAMES"
),则无法将其定义为数组,但应将其定义为对象:
{"NAMES":"cs.js" ...}
json_encode
如果您提供相应的PHP结构(即关联数组)并让它在不篡改的情况下完成其工作,那么它将为您完成。
"false"
将"false"
作为元素添加到courses数组似乎没什么用。在JavaScript中,您可以轻松检查数组中有多少元素,因此无需在末尾添加一种停止符号。
无论如何,如果在JavaScript中你引用了一个不存在的数组中的元素,你可以得到undefined
,你可以验证它,就像验证值"false"
一样。
我强烈建议不要这样做。
您在问题中提供的PHP代码可以替换为:
// Add the names element as a separate item next to the courses array,
// which we put in the "courses" property.
$major_array = array(
"names" => $major,
"courses" => $major_array
);
// Turn into JSON text with added line breaks and indentation:
$json_string = json_encode($major_array, JSON_PRETTY_PRINT);
// Don't touch the JSON text anymore, but output it:
echo "var initialCourse = $json_string;";
输出(JavaScript)类似于:
var initialCourse = {
"names": "cs",
"courses": [
{
"COURSE_ID": "ENGL 1013"
},
{
"COURSE_ID": "FAH1"
},
{
"COURSE_ID": "USHG1"
},
{
"COURSE_ID": "TECH 1001"
},
{
"COURSE_ID": "COMS 1403"
},
{
"COURSE_ID": "COMS 1411"
},
{
"COURSE_ID": "ENGL 1023"
},
{
"COURSE_ID": "SS1"
},
{
"COURSE_ID": "MATH 2914"
}
]
};
如上所述,这是一个对象结构,而不是数组结构,因为JavaScript不允许使用数组表示法中的命名键。如果在JavaScript中您需要迭代上述结构中的课程,您将解决courses
属性( 一个数组),如下所示:
for (var course of initialCourse.courses) {
console.log('course id: ' + course.COURSE_ID);
}
我必须说拥有一个属性的对象有点过分杀戮。这种结构更简洁有效:
var initialCourse = {
"names": "cs",
"courses": [
"ENGL 1013",
"FAH1",
"USHG1",
"TECH 1001",
"COMS 1403",
"COMS 1411",
"ENGL 1023",
"SS1",
"MATH 2914"
]
};
在JavaScript中,你会迭代这些课程:
for (var course of initialCourse.courses) {
console.log('course id: ' + course);
}
如果您对此感兴趣,您应该在我上面建议的任何PHP代码之前将此行添加到您的PHP代码中:
$major_array = array_map(function ($course) { return $course["COURSE_ID"]; }, $major_array);