使用PHP通过JSON字符串逐行读取


Reading Line by Line Using PHP Via JSON String

我正在尝试创建一个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", "&deg;", $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";