Невозможно получить текстовые поля и метки для динамической печати в php и HTML - PullRequest
0 голосов
/ 16 ноября 2009

У меня есть этот код, и он должен печатать ярлыки с текстовыми полями для людей, чтобы заполнить информацию. Он принимает текст вроде: $ tokens = "* существительное * существительное * глагол" и должен напечатать пользователю таблицу, которая имеет:

Существительное: (текстовое поле для заполнения) Существительное: (текстовое поле для заполнения) глагол: (текстовое поле для заполнения) и т. д.

но это не работает

echo "<form action=\"storygenerated.php\" method=\"post\">
        <input name=\"fields\" type=\"hidden\" value=\"$tokens\" />
        <input name=\"story\" type=\"hidden\" value=\"$story\" />
        <table>";
for ($i = 0; $i < count($tokenArray); $i++) {
    $fieldWords = split('_',$tokensArray[$i]);
    echo "<tr><td>";
    echo $fieldWords[0];
    for ($j = 1; $j < count($fieldWords); $j++) {
        echo " ".$fieldWords[$j];
    }
    echo ":";
    echo "</td><td><input name=\"$tokensArray[$i]\" type=\"text\" /></td></tr>";
}

который из этого кода генерирует текст $ tokens

$storyArray = split(' ', $story);
$tokens = ""; // space-delimited list of fields
$tokensArray=array();
for ($i = 0; $i < count($storyArray); $i++) {
    if ($storyArray[$i][0] == '*') {  
        $tokens .= $storyArray[$i] . " ";
        $tokensArray[] = $storyArray[$i];
    }
}

Ответы [ 3 ]

1 голос
/ 16 ноября 2009

В вашем коде есть несколько ошибок. Я начну с первого сегмента.

  1. В вашем for состоянии вы используете $tokenArray вместо $tokensArray (отсутствует s) в вашем count().

  2. В вашем последнем эхо, поскольку вы используете составную переменную ($tokensArray[$i]), вы должны заключить ее в фигурные скобки следующим образом: {$tokensArray[$i]}

Исправлен код для первой части:

echo "<form action=\"storygenerated.php\" method=\"post\">
        <input name=\"fields\" type=\"hidden\" value=\"$tokens\" />
        <input name=\"story\" type=\"hidden\" value=\"$story\" />
        <table>";
for ($i = 0; $i < count($tokensArray); $i++) {
    $fieldWords = split('_',$tokensArray[$i]);
    echo "<tr><td>";
    echo $fieldWords[0];
    for ($j = 1; $j < count($fieldWords); $j++) {
        echo " ".$fieldWords[$j];
    }
    echo ":";
    echo "</td><td><input name=\"{$tokensArray[$i]}\" type=\"text\" /></td></tr>";
}

Существует также несколько улучшений производительности, которые могут улучшить читаемость и упростить ваш код.

  • Поскольку для разделения строки используются символы, используйте explode() вместо split(). split() использует регулярное выражение для разделения строки по сравнению с explode(), которое просто использует простые символы.

  • Целое $fieldWords разделение и цикл можно заменить одним вкладышем:


echo str_replace('_', ' ', $tokensArray[$i]);
  • Вы разделяете строку $story вручную, когда использование регулярного выражения будет намного проще:

preg_match_all('/\*\w+/m', $story, $tokensArray);
$tokensArray = $tokensArray[0];
$tokens = implode(' ', $tokensArray); // Space delimited list of tokens
0 голосов
/ 16 ноября 2009

Две вещи я не делал. Во-первых, я имел дело с историей как с массивом, хотя это не так, это строка. Во-вторых, я фактически не заменял переменные значением, которое хотел опубликовать. Я решил проблему с помощью людей, которые разместили некоторую информацию здесь. Спасибо всем.

0 голосов
/ 16 ноября 2009

В строке

if ($storyArray[$i][0] == '*') {  

вы просто проверяете, является ли строка строкой с 1 символом, равным звездочке, поэтому я полагаю, что ваш $tokensArray[] всегда пуст.

Надеюсь, вы измените строки

echo $fieldWords[0];
for ($j = 1; $j < count($fieldWords); $j++) {
    echo " ".$fieldWords[$j];
}

с

foreach ($fieldWords as $word) {
    echo " ".$word;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...