Чтение построчно с использованием PHP через строку JSON

Я пытаюсь создать функцию PHP, которая позволит мне читать выбранные строки из текстового файла, используя строку JSON. Строка JSON состоит из двух чисел, разделенных запятой. Первое число — это строка, которую я хочу найти, а второе — это количество строк, которые нужно прочитать по нисходящей.

Например, у меня есть это предложение в отдельном текстовом файле:

A diving spiral attack in which Pikachu head butts downward while 
being surrounded by electricity.

(Если вам интересно, это часть моего будущего фан-сайта, который все еще находится в разработке).

Предложение начинается с 6-й строки и занимает 2 строки. Поэтому в моем файле JSON я бы написал «6,2». Команда взорвать() запускается с использованием запятой в качестве разделителя, что позволяет мне хранить эти числа в двух отдельных переменных, $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 в качестве маркеров для поиска строк из внешнего текста для печати, избегая при этом ошибок времени выполнения и фатальных ошибок?

(EDIT: проблема стала слишком сложной для меня, чтобы исправить, поэтому я решил пока отказаться от функции построчного поиска. Я вернусь к этому позже. Я оставлю код ниже для архивных целей. )

характер.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"
        }
    ]}

person Wammy    schedule 31.03.2015    source источник
comment
6,2 не является допустимым JSON. Массив JSON будет [6, 2].   -  person Barmar    schedule 31.03.2015
comment
@Barmar Нужно ли мне ставить скобки в строку этого файла JSON? Прямо сейчас он указан как desc:6,2.   -  person Wammy    schedule 31.03.2015
comment
Неважно, как вы установите $start и $length, когда доберетесь до SplFileObject. Сообщение об ошибке в вашей неудачной версии указывает на то, что вы пытаетесь открыть /.txt вместо /pikachu/pikachu.txt.   -  person Barmar    schedule 31.03.2015
comment
Не обращайте внимания на мой предыдущий комментарий, это было до того, как вы опубликовали код. Я думал, вы имели в виду, что 6,2 было содержимым файла JSON.   -  person Barmar    schedule 31.03.2015
comment
Хотя кажется, что было бы лучше, если бы ваш JSON был "desc": [6, 2], тогда вам не нужно было бы использовать explode.   -  person Barmar    schedule 31.03.2015
comment
Пожалуйста, опубликуйте фактический код в вопросе. Проблема, с которой вы столкнулись, заключается в том, что вы используете неопределенную переменную $name при создании SplFileObject, и этот код не входит в вопрос.   -  person Barmar    schedule 31.03.2015
comment
@Barmar SplFileObject кажется вероятным виновником. В каком бы направлении я ни публиковал, я всегда получал ту или иную подобную ошибку. На самом деле, я попытался заменить его на file_get_contents, но все равно получил ту же ошибку. Я обновлю его с этим упоминанием.   -  person Wammy    schedule 31.03.2015
comment
Вам нужно узнать о области видимости переменных. Вам нужно либо передать $name в качестве аргумента функции descrw, либо добавить global $name в функцию.   -  person Barmar    schedule 31.03.2015
comment
@Barmar Я добавил ссылку на главную страницу теста песочницы. Вы увидите его как исходный код testfail.php. Это текстовый файл.   -  person Wammy    schedule 31.03.2015
comment
Я прочитал код. Вы должны опубликовать его ЗДЕСЬ, чтобы это был правильно написанный вопрос.   -  person Barmar    schedule 31.03.2015
comment
Я только что снова попробовал неудачную версию, теперь я не получаю сообщения об ошибке. Что вы с этим сделали?   -  person Barmar    schedule 31.03.2015
comment
Почему вы делаете все это с плоскими файлами? Если у вас есть какой-то веб-сервис, который позволяет вам хранить информацию о поиске строки для определенных значений $name, почему бы просто не сохранить соответствующий контент в том же хранилище данных, а не искать где-то в плоском файле? Другими словами, почему бы просто не получить вывод вызова characters/$name/$name.json просто для получения тех данных, которые вы ищете?   -  person Mike Brant    schedule 31.03.2015
comment
@MikeBrant Вы имеете в виду MySQL? У меня нет прав доступа к этой программе.   -  person Wammy    schedule 31.03.2015
comment
@Wammy Существует ряд возможных решений (включая решения на основе баз данных). Как минимум, если вы хотите придерживаться решения на основе файлов, почему бы не настроить файлы для более прямого доступа к вашим данным. Другими словами, зачем использовать координаты поиска в одном файле для поиска фактического содержимого в другом файле? Ваша структура данных кажется ошибочной.   -  person Mike Brant    schedule 01.04.2015
comment
@MikeBrant Я не понимаю, что ты имеешь в виду. Когда я придумал функцию построчного поиска, в основном это было сделано для того, чтобы не писать лишние текстовые файлы. Например, я не хочу иметь один текст для одного хода, а затем другой текст для второго хода. Моя основная задача заключалась в том, чтобы уменьшить количество файлов: получить как можно больше информации с наименьшим количеством файлов. Я планирую иметь четыре: изображение, JSON, текст для описания движений и текст для дополнительных заметок.   -  person Wammy    schedule 01.04.2015
comment
@Wammy Но где-то вам все еще нужно управлять сопоставлением между полным контентом и тем, где в этом контенте находятся строки для описания движения конкретного персонажа. Итак, вы создали кучу файлов JSON для каждого отдельного имени персонажа. Что вам действительно нужно сделать, так это посмотреть на интересующие вас данные и подумать о том, как вам нужно искать эти данные (например, по имени персонажа или как-то еще), и составить структуру данных, которая эффективно поддерживает ваши варианты использования поиска.   -  person Mike Brant    schedule 01.04.2015
comment
@MikeBrant Я не знаю, как бы я это сделал. Я могу сказать вам, что причина, по которой я пошел к методу построчного поиска, заключается в том, что я боюсь снова сломать свой экран. Год назад я использовал Notepad++ для редактирования некоторых строк внутри файла JSON. Редактирование было в конце строки, а сама строка была очень длинной. Как только я дошел до конца, БАМ - экран превратился в кашу, и мне пришлось перезагрузить компьютер. С тех пор я установил ограничение на количество символов, которые я могу иметь на экране, чтобы предотвратить повторное нарушение разрешения моего экрана.   -  person Wammy    schedule 01.04.2015


Ответы (1)


Проблема в этой функции и не имеет ничего общего с вашим использованием 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";
person Barmar    schedule 31.03.2015
comment
(Извините за поздний ответ, исправлял формат кода) Это исправление действительно помогло. Все, что мне осталось сделать, это отредактировать последнюю часть так, чтобы она появилась внутри белого прямоугольника. Если вы щелкнете по названию перемещения в демоверсии, вы увидите белый DIV. Текст, к сожалению, был размещен вне его. Я смог исправить это, изменив код возврата, но он дает мне только одну строку, как показано в демонстрации. - person Wammy; 31.03.2015
comment
descrw должен возвращать строку, а не отображать ее саму, чтобы конкатенация работала правильно. - person Barmar; 31.03.2015
comment
Это сделало это! Я обновил строку PHP для остальных классов CSS (обычный, специальный, Hyper, Final). Я очень мало знаю PHP (то есть: начинающие вещи, такие как эхо и сохранение переменных), но я никогда раньше не занимался такими сложными вещами, как это. Я рад узнать, что С.О. является большим спасательным кругом. Спасибо, Бармар. - person Wammy; 31.03.2015
comment
У нас есть проблемы. Код работал на тесте, но не работает на самом деле. Выскочила новая ошибка. Я выложу истинный код из корневой папки MCP вместо тестового, так как они будут удалены. - person Wammy; 31.03.2015
comment
Похоже, каталог characters не там, где вы думаете. Ваш код предполагает, что это будет подкаталог каталога, содержащего скрипт. - person Barmar; 31.03.2015