Быстрое обновление: Причина, по которой мне нужно это решение, заключается в том, что этот один файл php используется для расширения плоского файла примерно для сотен пользователей (которые все используют один и тот же файл php, но имеют свои собственные плоские файлы).
РЕШЕНИЕ:
Я работал с этим еще один день, перефразировал вопрос и получил действительно отличный ответ. Я добавляю это сюда для будущей помощи другим:
$content = file_get_contents("newstest.db");
$content = preg_replace('/(^ID:.*\S)/im', '$1value4:::', $content);
$content = preg_replace('/(^\d+.*\S)/im', '$1:::', $content);
file_put_contents("newstest.db", $content);
Исходное содержимое плоского файла, использованного при тестировании кода, было:
ID:::value1:::value2:::value3:::
1:::My:::first:::line:::
2:::My:::second:::line:::
3:::Your:::third:::line:::
ОРИГИНАЛЬНЫЙ ВОПРОС:
У меня есть скрипт PHP, который я пытаюсь изменить. Будучи новичком в PHP и искал как здесь, так и в Google, не найдя решения, я спрашиваю здесь.
Мне нужно добавить больше значений (столбцов) в плоский файл автоматически, если «столбец» не существует ранее.
Поскольку этот один файл PHP используется многими пользователями (у каждого из которых есть собственный плоский файл), мне нужен способ автоматического добавления новых «столбцов» в их плоские файлы, если столбец не существует. Выполнение этого вручную занимает очень много времени, и я уверен, что есть простой способ.
ИНФОРМАЦИЯ:
Плоский файл называется «newstest.db»
Плоский файл имеет такой макет:
id:::title:::short:::long:::author:::email:::value1:::value2:::value3:::
Итак делитель есть :::
Я понимаю основы, которые мне нужно добавить, например, «value4 :::» после «value3 :::» в первой строке news.db, затем добавить ::: к другим существующим строкам, чтобы обновить все строки и подготовиться к новому «value4»
Сегодня php использует это для подключения к плоскому файлу:
($ filesource — это путь к плоскому файлу, включая его имя. Уникальный для каждого пользователя.)
$connect_to_file = connect_pb ($filesource);
И для записи в файл, который я использую:
insert_pb($filesource,"$new_id:::$title:::$short:::$long:::$author:::$email:::$value1:::::::::");
(Как вы видите в этом случае значения 2 и 3 в этом случае не используются, но используются в других.)
ВОПРОС:
Существует ли быстрый / существующий код php, который можно использовать для добавления нового столбца, если он еще не существует? Или мне нужно сделать код php для этой конкретной задачи?
Я понимаю, что код должен что-то делать вместе:
Я не знаю с чего начать, но я пробовал несколько часов.
Это я поняла:
update_pb(pathtofiletosaveto,"id","x == (ID of news)","value in first line","value to add");
Но я не знаю, как сделать заявление, как в 1) выше, ни как обновить строку 0 в плоском файле, чтобы добавить «value4 :::» в конце и т. д.
МОЙ КОД (не работает как положено):
ИЛИ, может быть, мне нужно прочитать только строку 1 в файле (newstest.db), а затем обменять ее новой строкой, если значение «value4» отсутствует в строке 1?
Предложение, но я не знаю, как сделать все:
(Вероятно, он полон ошибок, так как я пытался читать и находить примеры и комбинировать код.)
<?php
// specify the file
$file_source="newstest.db";
// get the content of the file
$newscontent = file($file_source, true);
$lines ='';
// handle the content, add "value4:::" and ":::" to the lines
foreach ($newscontent as $line_num => $linehere) {
// add "value4:::" at the end of first line only, and put it in memory
if($line_num[0]) {$lines .= $linehere.'value4:::';}
else {
// then add ":::" to the other lines and add them to memory
$lines .= $linehere.':::';
}
// echo results just to see what is going on
//echo 'Line nr'.$line_num.':<br />'.$lines.'<br /><br />';
}
// add
// to show the result
echo "Here is the result:<br /><br />".$lines."<br /><br />";
//Write new content to $file_source
$f = fopen($file_source, 'w');
fwrite($f,$lines);
fclose($f);
echo "done updating database flat file";
?>
Это ПОЧТИ работает …
Но это не добавляет «value4 :::» в конец первой строки,
и это не добавляет «:::» к конец из следующих строк, но в начале …
Итак, остается пара вопросов:
1) Как я могу искать в строке 0 после «value4», а затем написать «value4 :::» в конце строки?
2) Как добавить «:::» в конце каждой строки, а не в начале?
Я прошу вас либо помочь мне с этим.
Вы обязательно должны использовать PHP для этой задачи? Кажется, что-то, что вам нужно сделать только один раз, и гораздо проще сделать по-другому.
Например, если у вас есть * nix shell с sed, sed -i 's/$/:::/' <file>
выполню эту задачу за вас.
Других решений пока нет …