Модификация массива строк и запись в файл на PHP - PullRequest
0 голосов
/ 26 октября 2011

У меня сейчас есть этот блок:

if ($type == "up") {
    $lines_ = file('../indexIncomplete');
    $counter = 0;
    foreach ($lines_ as $value) {
        $postLen = strlen($post);
        if ( substr($value, 0, $postLen) === $post ) {
            break;
        }
        $counter++;
    }
    list($title, $location, $votes, $poster, $date) = explode("|", $lines_[$counter]);
    $votes = $votes + 1;
    $newValue = $title.'|'.$location.'|'.$votes.'|'.$poster.'|'.$date;
    $lines_[$counter] = $newValue;
    file_put_contents('../indexIncomplete', $lines_);
}

Это содержится на странице HTML, которая содержит форму, которая вызывает ее (над этим блоком есть некоторая логика, которая выполняет проверку и прочее, здесь я сузил проблему).

Я вытягиваю содержимое файла в массив. Затем я просматриваю массив, чтобы увидеть, соответствует ли один из них $post (строка, объявленная ранее). Если он совпадает, цикл прерывается, и счетчик указывает на позицию в массиве, который содержит соответствующую строку. Затем я беру различные части строки (используя explode()). Я беру $value, увеличиваю его и перестраиваю новую запись массива. Я заменяю старую запись массива новой, которую я только что построил на этой строке:

$lines_[$counter] = $newValue;

Я записываю новый массив обратно в файл. Проблема в том, что $newValue при записи, похоже, не воспринимает любую другую переменную, кроме $votes, что делает ее похожей на это:

||1||

Где число - это правильное количество голосов. Он должен выглядеть так:

$title|$location|$votes|$poster|$date

Кроме того, он не появляется на строке, которую он должен. Вместо этого он добавляется в конец файла. Я очень смущен.

Ответы [ 2 ]

2 голосов
/ 26 октября 2011

, поскольку file_put_contents записывает в то же место, откуда он читается, и это HTML-форма, я рекомендую заблокировать файл, чтобы он не был поврежден несколькими записями одновременно:

$file_put_contents('../indexIncomplete', $lines_, LOCK_EX);

Если все по-прежнему выглядит шатко, var_dump (или log) $ post, а также $ lines _ [$ counter], чтобы убедиться, что ваши значения соответствуют вашим ожиданиям

0 голосов
/ 26 октября 2011

Думаю, проблема в том, что код ниже вашего оператора foreach всегда будет выполняться, даже если ни одна из строк в файле не соответствует вашему оператору if.

В этом случае для $ counter будет установлено значение на единицу выше, чем последний элемент в вашем массиве. Это означает, что вы получите доступ к несуществующему ключу массива, когда вызовете «$ lines _ [$ counter]», который вернет «null» (PHP не выполняет массив из-за ошибок, таких как java, хотя он выдаст предупреждение об уровне E_NOTICE)

Поскольку значение счетчика на 1 больше размера вашего массива, оно будет добавлено в конец файла.

Я предлагаю вам переместить этот код в свой foreach до перерыва.

list($title, $location, $votes, $poster, $date) = explode("|", $lines_[$counter]);
$votes = $votes + 1;
$newValue = $title.'|'.$location.'|'.$votes.'|'.$poster.'|'.$date;
$lines_[$counter] = $newValue;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...