我正在尝试创建一个PHP函数,该函数将允许我使用JSON字符串从文本文件中读取选定的行。JSON字符串由两个用逗号分隔的数字组成。第一个数字是我要查找的行,第二个数字是向下读取的行数。
例如,我在一个单独的文本文件中有这样一句话:
A diving spiral attack in which Pikachu head butts downward while
being surrounded by electricity.
(如果你想知道,这是我即将推出的粉丝网站的一部分,仍在建设中)。
这个句子从第6行开始,用掉了2行。所以在我的JSON文件中,我会写"6,2"。explode()命令是使用逗号作为分隔符运行的,允许我将这些数字存储到两个单独的变量中,$start和$length。
$result = explode(",", $sample); // In JSON string, $sample is $i["desc"]
$start = $result[0];
$length = $result[1];
现在变量就位后,将调用以下行来执行实际的逐行提取。
$file = new SplFileObject("pikachu/pikachu.txt");
for ($i = $start; $i <= ($start+$length); $i++) {
$file->seek($i-1);
echo "$file";
}
我使用直接调用而不是通过JSON解析来测试我的脚本。奏效了。但是,当我尝试使用JSON字符串时,我得到了一个Runtime和一个Fatal Error。
如何修复脚本,以便使用JSON字符串作为标记,从外部文本中查找要打印的行,同时避免运行时和致命错误?
(编辑:这个问题对我来说太难解决了,所以我决定暂时放弃逐行搜索功能。我稍后会重新访问这个功能。我将把下面的代码留作存档之用。)
character.php
<?php
$name = $_GET['name'];
// Step 1: Get the name from the previous page and store it.
$file = file_get_contents("characters/$name/$name.json");
// Step 2: Use the name to find a JSON file for the character (We'll do the moves list later).
$json = json_decode($file, true);
// Step 3: Decode the JSON file
$character = $json["character"][0]["name"];
$group = $json["character"][0]["group"];
$series = $json["character"][0]["series"];
$story = $json["character"][0]["story"];
$snapback = $json["character"][0]["snapback"];
$interrupt = $json["character"][0]["interrupt"];
$hiddenpow = $json["character"][0]["hiddenpow"];
$disrupt = $json["character"][0]["disrupt"];
$assist1 = $json["character"][0]["assist1"];
$assist2 = $json["character"][0]["assist2"];
$assist3 = $json["character"][0]["assist3"];
$counter = $json["character"][0]["counter"];
$bros = $json["character"][0]["bros"];
$party = $json["character"][0]["party"];
$ground = $json["character"][0]["ground"];
$jump = $json["character"][0]["jump"];
$superjump = $json["character"][0]["superjump"];
$launcher = $json["character"][0]["launcher"];
$altlaunch = $json["character"][0]["altlaunch"];
$acfinisher = $json["character"][0]["acfinisher"];
// Step 4: Retrieve variables and store them for use
echo "<HTML>'n";
echo "<HEAD>'n";
echo "<TITLE>Marvel & Capcom vs. Pokemon: $character</TITLE>'n'n";
echo "<LINK rel='"stylesheet'" type='"text/css'" href='"http://fonts.googleapis.com/css?family=Roboto'">'n";
echo "<LINK rel='"stylesheet'" type='"text/css'" href='"http://fonts.googleapis.com/css?family=Open+Sans'">'n";
echo "<LINK rel='"stylesheet'" type='"text/css'" href='"media/style.css'">'n";
echo "<SCRIPT type='"text/javascript'" src='"media/tabs.js'"></SCRIPT>'n";
echo "<SCRIPT type='"text/javascript'">'n";
echo "function toggle_visibility(id) {'n";
echo " var movename = id.nextSibling.nextSibling;'n";
echo " if(movename.style.display == '"block'")'n";
echo " movename.style.display = '"none'";'n";
echo " else'n";
echo " movename.style.display = '"block'";'n";
echo "}'n";
echo "</SCRIPT>";
echo "</HEAD>'n'n";
echo "<BODY onload='"init()'">'n'n";
// Step 5: The HTML stuff begins
echo "<TABLE id='"Character'">'n";
echo " <TR>'n";
echo " <TD class='"Name'">" . strtoupper($character) . "</TD>'n";
echo " <TD class='"Image'" rowspan='"4'"><IMG src='"characters/$name/$name.jpg'"></TD></TR>'n";
echo " <TR>'n";
echo " <TD class='"Series'">Series: $series</TD></TR>'n";
echo " <TR>'n";
echo " <TD class='"Story'">$story</TD></TR>'n";
// Step 6: Write the variables to the file
echo " <TR>'n";
echo " <TD style='"vertical-align: top'">'n";
echo " <TABLE id='"$group'">'n";
function moverw ($move) {
$subfollow = "FOLLOW>>";
$follow = "FOLLOW>";
if (strpos($move,$subfollow) !== false)
$move .= " (followup)";
else if (strpos($move,$follow) !== false)
$move .= " (followup)";
$move = str_replace("FOLLOW>>", "<IMG class='"Followup'" src='"images/follow.png'" style='"text-indent: 5px'"> ", $move);
$move = str_replace("FOLLOW>", "<IMG class='"Followup'" src='"images/follow.png'"> ", $move);
return ($move);
}
function descrw ($desc,$name) {
$result = explode(",", $desc);
$start = $result[0];
$length = $result[1];
$file = new SplFileObject("characters/$name/$name.txt");
$result = "";
for ($i = $start; $i <= ($start+$length); $i++) {
$file->seek($i-1);
$result .= $file;
}
return($result);
}
function commrw ($command) {
$command = str_replace("AM,", "<IMG title='"Assist Mode'" src='"images/assist.gif'"> ", $command);
$command = str_replace("SM,", "<IMG title='"Single Mode'" src='"images/single.gif'"> ", $command);
$command = str_replace("BRAWL,", "<IMG title='"Super Smash Brawl'" src='"images/brawl.png'"> ", $command);
$command = str_replace("uf,", "<IMG class='"Arrow'" src='"images/uf.png'">", $command);
$command = str_replace("df,", "<IMG class='"Arrow'" src='"images/df.png'">", $command);
$command = str_replace("ub,", "<IMG class='"Arrow'" src='"images/ub.png'">", $command);
$command = str_replace("db,", "<IMG class='"Arrow'" src='"images/db.png'">", $command);
$command = str_replace("u,", "<IMG class='"Arrow'" src='"images/u.png'">", $command);
$command = str_replace("f,", "<IMG class='"Arrow'" src='"images/f.png'">", $command);
$command = str_replace("d,", "<IMG class='"Arrow'" src='"images/d.png'">", $command);
$command = str_replace("b,", "<IMG class='"Arrow'" src='"images/b.png'">", $command);
$command = str_replace("+", "<IMG class='"Plus'" src='"images/plus.png'">", $command);
$command = str_replace("AP", "<IMG class='"Button'" src='"images/punch.png'">", $command);
$command = str_replace("AK", "<IMG class='"Button'" src='"images/kick.png'">", $command);
$command = str_replace("A1", "<IMG class='"Button'" title='"Assist 1'" src='"images/assist1.png'">", $command);
$command = str_replace("A2", "<IMG class='"Button'" title='"Assist 2'" src='"images/assist2.png'">", $command);
$command = str_replace("AB", "<IMG class='"Button'" title='"Assist'" src='"images/assist.png'">", $command);
$command = str_replace("LP", "<IMG class='"Button'" title='"Jab'" src='"images/jab.png'">", $command);
$command = str_replace("LK", "<IMG class='"Button'" title='"Short'" src='"images/short.png'">", $command);
$command = str_replace("MP", "<IMG class='"Button'" title='"Strong'" src='"images/strong.png'">", $command);
$command = str_replace("MK", "<IMG class='"Button'" title='"Forward'" src='"images/forward.png'">", $command);
$command = str_replace("HP", "<IMG class='"Button'" title='"Fierce'" src='"images/fierce.png'">", $command);
$command = str_replace("HK", "<IMG class='"Button'" title='"Roundhouse'" src='"images/roundhouse.png'">", $command);
$command = str_replace("FOLLOW>>", "<IMG class='"Followup'" src='"images/follow.png'" style='"text-indent: 5px'"> ", $command);
$command = str_replace("FOLLOW>", "<IMG class='"Followup'" src='"images/follow.png'"> ", $command);
$command = str_replace("degrees", "°", $command);
return ($command);
}
function typerw ($type) {
$type = str_replace("BUG.", "<IMG src='"images/bug.png'">", $type);
$type = str_replace("CYBER.", "<IMG src='"images/cyber.png'">", $type);
$type = str_replace("DARK.", "<IMG src='"images/dark.png'">", $type);
$type = str_replace("DRAGON.", "<IMG src='"images/dragon.png'">", $type);
$type = str_replace("ELECTRIC.", "<IMG src='"images/electric.png'">", $type);
$type = str_replace("FAIRY.", "<IMG src='"images/fairy.png'">", $type);
$type = str_replace("FIGHTING.", "<IMG src='"images/fighting.png'">", $type);
$type = str_replace("FIRE.", "<IMG src='"images/fire.png'">", $type);
$type = str_replace("FLYING.", "<IMG src='"images/flying.png'">", $type);
$type = str_replace("GHOST.", "<IMG src='"images/ghost.png'">", $type);
$type = str_replace("GRASS.", "<IMG src='"images/grass.png'">", $type);
$type = str_replace("GROUND.", "<IMG src='"images/ground.png'">", $type);
$type = str_replace("ICE.", "<IMG src='"images/ice.png'">", $type);
$type = str_replace("LIGHT.", "<IMG src='"images/light.png'">", $type);
$type = str_replace("NORMAL.", "<IMG src='"images/normal.png'">", $type);
$type = str_replace("PSYCHIC.", "<IMG src='"images/psychic.png'">", $type);
$type = str_replace("STEEL.", "<IMG src='"images/steel.png'">", $type);
$type = str_replace("WATER.", "<IMG src='"images/water.png'">", $type);
return ($type);
}
function noterw ($note) {
$note = str_replace(".AM.", "<IMG title='"Assist Mode'" src='"images/assist.gif'"> ", $note);
$note = str_replace(".SM.", "<IMG title='"Single Mode'" src='"images/single.gif'"> ", $note);
$note = str_replace(".HP.", "<IMG class='"HiddenPower'" title='"Hidden Power'"src='"images/hiddenpower.png'">", $note);
return ($note);
}
foreach ($json["character"][0]["moves"] as $i) {
if ($i["flag"] == "normal") {
$move = strtoupper($i["move"]);
$desc = $i["desc"];
$command = $i["comm"];
$type = $i["type"];
$note = $i["note"];
echo " <TR>'n";
echo " <TD class='"MoveName Normal'"><A href='"javascript:;'" onclick='"toggle_visibility(this);'">" . moverw($move) . "</A>'n";
echo " <DIV class='"Details'">" . descrw($desc,$name) . "</DIV></TD>'n";
echo " <TD class='"Command'">" . commrw($command) . "</TD>'n";
echo " <TD class='"Type'">" . typerw($type) . "</TD>'n";
echo " <TD class='"Note'">" . noterw($note) . "</TD></TR>'n";
}
if ($i["flag"] == "special") {
$move = strtoupper($i["move"]);
$command = $i["comm"];
$type = $i["type"];
$note = $i["note"];
echo " <TR>'n";
echo " <TD class='"MoveName Special'"><A href='"javascript:;'" onclick='"toggle_visibility(this);'">" . moverw($move) . "</A>'n";
echo " <DIV class='"Details'">" . $i["desc"] . "</DIV></TD>'n";
echo " <TD class='"Command'">" . commrw($command) . "</TD>'n";
echo " <TD class='"Type'">" . typerw($type) . "</TD>'n";
echo " <TD class='"Note'">" . noterw($note) . "</TD></TR>'n";
}
if ($i["flag"] == "hyper") {
$move = strtoupper($i["move"]);
$command = $i["comm"];
$type = $i["type"];
$note = $i["note"];
echo " <TR>'n";
echo " <TD class='"MoveName Hyper'"><A href='"javascript:;'" onclick='"toggle_visibility(this);'">" . moverw($move) . "</A>'n";
echo " <DIV class='"Details'">" . $i["desc"] . "</DIV></TD>'n";
echo " <TD class='"Command'">" . commrw($command) . "</TD>'n";
echo " <TD class='"Type'">" . typerw($type) . "</TD>'n";
echo " <TD class='"Note'">" . noterw($note) . "</TD></TR>'n";
}
if ($i["flag"] == "final") {
$move = strtoupper($i["move"]);
$command = $i["comm"];
$type = $i["type"];
$note = $i["note"];
echo " <TR>'n";
echo " <TD class='"MoveName Final'"><A href='"javascript:;'" onclick='"toggle_visibility(this);'">" . moverw($move) . "</A>'n";
echo " <DIV id='"Final'" class='"Details'">" . $i["desc"] . "</DIV></TD>'n";
echo " <TD class='"Command'">" . commrw($command) . "</TD>'n";
echo " <TD class='"Type'">" . typerw($type) . "</TD>'n";
echo " <TD class='"Note'">" . noterw($note) . "</TD></TR>'n";
}
}
// Step 7: Write the moves. When Command and Type are parsed, execute respective rewriters. Saves me from typing lots, hun ;)
echo " </TABLE></TD></TR>'n";
echo " <TR>'n";
echo " <TD colspan='"2'">'n";
echo " <UL id='"tabs'">'n";
echo " <LI><A href='"#Single'" onclick='"showTab()'">SINGLE MODE</A></LI>'n";
echo " <LI><A href='"#Assist'" onclick='"showTab()'">ASSIST MODE</A></LI>'n";
echo " <LI><A href='"#Combo'" onclick='"showTab()'">COMBO PROFILE</A></LI>'n";
echo " <LI><A href='"#Attack'" onclick='"showTab()'">ATTACK PROFILE</A></LI></UL>'n";
echo " <DIV class='"tabContent'" id='"Single'">'n";
echo " <TABLE id='"Single'" border=1>'n";
echo " <TR>'n";
echo " <TH>Snapback:</TH>'n";
echo " <TD>$snapback</TD></TR>'n";
echo " <TR>'n";
echo " <TH>Interrupt:</TH>'n";
echo " <TD>$interrupt</TD></TR>'n";
echo " <TR>'n";
echo " <TH>Hidden Power:</TH>'n";
echo " <TD>$hiddenpow</TD></TR>'n";
echo " <TR>'n";
echo " <TH class='"Header Rumble'"colspan='"2'">RUMBLE CHART</TH></TR>'n";
echo " <TR>'n";
echo " <TD colspan='"2'"></TH></TR></TABLE></DIV>'n";
echo " <DIV class='"tabContent'" id='"Assist'">'n";
echo " <TABLE id='"Assist'" border=1>'n";
echo " <TR>'n";
echo " <TH>Disrupt:</TH>'n";
echo " <TD>$disrupt</TD></TR>'n";
echo " <TR>'n";
echo " <TH colspan=2>Assist Attacks</TH></TR>'n";
echo " <TR>'n";
echo " <TH><IMG class='"Button'" title='"Assist'" src='"images/assist.png'"></TH>'n";
echo " <TD>$assist1</TD></TR>'n";
echo " <TR>'n";
echo " <TH><IMG class='"Button'" title='"Assist'" src='"images/assist.png'"><IMG class='"Plus'" src='"images/plus.png'"><IMG class='"Button'" title='"Fierce'" src='"images/fierce.png'"></TH>'n";
echo " <TD>$assist2</TD></TR>'n";
echo " <TR>'n";
echo " <TH><IMG class='"Button'" title='"Assist'" src='"images/assist.png'"><IMG class='"Plus'" src='"images/plus.png'"><IMG class='"Button'" title='"Roundhouse'" src='"images/roundhouse.png'"></TH>'n";
echo " <TD>$assist3</TD></TR>'n";
echo " <TR>'n";
echo " <TH>Cross-Over Counter:</TH>'n";
echo " <TD>$counter</TD></TR>'n";
echo " <TR>'n";
echo " <TH colspan=2>Super Smash Melee</TH></TR>'n";
echo " <TR>'n";
echo " <TH>Bros. Attack:</TH>'n";
echo " <TD>$bros</TD></TR>'n";
echo " <TR>'n";
echo " <TH>Party Attack:</TH>'n";
echo " <TD>$party</TD></TR></TABLE></DIV>'n";
echo " <DIV class='"tabContent'" id='"Combo'">'n";
echo " <TABLE id='"Combo'" border=1>'n";
echo " <TR>'n";
echo " <TH colspan=2>???</TH></TR>'n";
echo " <TR>'n";
echo " <TH>Ground:</TH>'n";
echo " <TD>$ground</TD></TR>'n";
echo " <TR>'n";
echo " <TH>Jump:</TH>'n";
echo " <TD>$jump</TD></TR>'n";
echo " <TR>'n";
echo " <TH>Super Jump:</TH>'n";
echo " <TD>$superjump</TD></TR>'n";
echo " <TR>'n";
echo " <TH colspan=2></TH></TR>'n";
echo " <TR>'n";
echo " <TH>Launcher:</TH>'n";
echo " <TD>$launcher</TD></TR>'n";
if ($altlaunch != null) {
echo " <TR>'n";
echo " <TH>Alternate Launch:</TH>'n";
echo " <TD>$altlaunch</TD></TR>'n";
}
echo " <TR>'n";
echo " <TH>AC Finishers:</TH>'n";
echo " <TD>$acfinisher</TD></TR></TABLE></DIV>'n";
echo " <DIV class='"tabContent'" id='"Attack'">'n";
echo " $test 4'n";
echo " </DIV>'n";
echo " </TD></TR></TABLE></TD></TR></TABLE>'n'n";
echo "</BODY></HTML>";
?>
$name.json,其中$name是角色的名称(使用皮卡丘作为演示):
{"character":[
{
"name":"Pikachu",
"group":"Pokemon",
"series":"Pokemon",
"story":"To-do...",
"moves":[
{
"flag":"normal",
"move":"Discharge",
"desc":"3,2",
"comm":"Press HP (crouch) (air)",
"type":"ELECTRIC.",
"note":"Notes"
},
{
"flag":"normal",
"move":"Electric Screw",
"desc":"6,2",
"comm":"Tilt d,+HP [air]",
"type":"ELECTRIC.",
"note":"Notes"
},
{
"flag":"normal",
"move":"Tackle",
"desc":"9,1",
"comm":"Tap f, , f,",
"type":"NORMAL.",
"note":"Notes"
},
{
"flag":"special",
"move":"Quick Attack",
"desc":"11,2",
"comm":"Tap any direction and Press AP (air)",
"type":"ELECTRIC.FIGHTING.",
"note":"Notes"
},
{
"flag":"special",
"move":"Thunder Jolt",
"desc":"14",
"comm":"Motion d,df,f,+AP",
"type":"ELECTRIC.",
"note":"Notes"
},
{
"flag":"special",
"move":"Electro Ball",
"desc":"16,2",
"comm":"Motion d,df,f,+AP [air]",
"type":"ELECTRIC.",
"note":"Notes"
},
{
"flag":"special",
"move":"Thunder",
"desc":"19,2",
"comm":"Motion f,d,df,+AP (air)",
"type":"ELECTRIC.",
"note":"Notes"
},
{
"flag":"special",
"move":"Electric Chair",
"desc":"22,2",
"comm":"Motion f,df,d,db,b,+AP",
"type":"ELECTRIC.",
"note":"Notes"
},
{
"flag":"hyper",
"move":"Thunder Shock",
"desc":"25,2",
"comm":"Motion d,df,f,+APAP (air)",
"type":"ELECTRIC.",
"note":"Notes"
},
{
"flag":"hyper",
"move":"Thunder Bolt",
"desc":"28,1",
"comm":"Motion d,df,f,+AKAK (air)",
"type":"ELECTRIC.",
"note":"Notes"
},
{
"flag":"hyper",
"move":"Skull Bash",
"desc":"30,2",
"comm":"Motion d,db,b,+APAP (air)",
"type":"ELECTRIC.FIGHTING.",
"note":"Notes"
},
{
"flag":"final",
"move":"Volt Tackle",
"desc":"33,2",
"comm":"Motion d,df,f,d,df,f,+APAP (air)",
"type":"ELECTRIC.",
"note":"Notes"
}],
"snapback":"Crouching Forward",
"interrupt":"Thunder Jolt, Thunder",
"hiddenpow":"Hidden Power Enhancements (Line per line lookup)",
"disrupt":"Thunder",
"assist1":"Thunder Jolt",
"assist2":"Thunder",
"assist3":"Quick Attack",
"counter":"Thunder",
"bros":"Skull Bash",
"party":"Thunder Bolt",
"ground":"Punch to Kick",
"jump":"Punch to Kick",
"superjump":"Zig Zag",
"launcher":"Standing Roundhouse",
"altlaunch":"Crouching Strong",
"acfinisher":"Discharge, Electric Screw, Quick Attack, Electro Ball, Thunder, Thunder Shock, Thunder Bolt, Skull Bash"
}
]}
问题出在这个函数中,与您使用JSON无关。这只是一个简单的可变范围问题。
function descrw ($desc) {
$result = explode(",", $desc);
$start = $result[0];
$length = $result[1];
$file = new SplFileObject("$name/$name.txt");
for ($i = $start; $i <= ($start+$length); $i++) {
$file->seek($i-1);
echo "$file";
}
return(0);
}
变量$name
未定义,因此它正在尝试打开文件/.txt
。您需要更改函数,使其将$name
作为参数。由于descrw
的调用方希望它返回一个字符串以便进行连接,因此descrw
不应该执行自己的echo
。
function descrw ($desc, $name) {
$result = explode(",", $desc);
$start = $result[0];
$length = $result[1];
$file = new SplFileObject("$name/$name.txt");
$result = '';
for ($i = $start; $i <= ($start+$length); $i++) {
$file->seek($i-1);
$result .= $file;
}
return($result);
}
然后更改调用它以传递参数的位置:
echo " <DIV class='"Details'">" . descrw($desc, $name) . "</DIV></TD>'n";