#php
#php
Вопрос:
Я пытаюсь сохранить данные из файла на случай, если строка не соответствует символу. В моем случае у меня есть список чисел, я хочу сохранить эти числа, если только первый символ не равен «0» -нулю-
Вот мой код:
<?php
$cleanfile = "cleanfile.txt";
$handle = fopen("file.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
if ($line[0] != 0) {
$save = file_put_contents($cleanfile, $line);
}
}
fclose($handle);
} else {
// error opening the file.
}
Мой file.txt содержит следующие записи:
1
2
3457
94
31
54
039
3114
94
01
33333
1
2
3457
94
31
54
039
3114
94
01
33333
1
2
3457
94
31
54
039
3114
94
01
33333
Комментарии:
1. Расскажите нам, где вы застряли.
2. На самом деле это не сохранение записей, которые не начинаются с 0, он сохраняет только «01» в cleanfile.txt
3. Так что это похоже на то, что если это условие не выполняется, если ($line[0] != 0)
4. Из документации : если имя файла не существует, файл создается. В противном случае существующий файл перезаписывается, если не установлен флаг FILE_APPEND.
Ответ №1:
Вам нужно передать FILE_APPEND
флаг file_put_contents()
, например:
<?php
$cleanfile = "cleanfile.txt";
$handle = fopen("file.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
if ($line[0] != 0) {
$save = file_put_contents($cleanfile, $line, FILE_APPEND);
}
}
fclose($handle);
} else {
// error opening the file.
}
Однако ваше решение немного требует ресурсов, поскольку каждый вызов file_put_contents()
генерирует ненужные накладные расходы. Пожалуйста, рассмотрите эту демонстрацию как более легкое и компактное решение:
<?php
// Collect all non-filtered lines.
$sieved = [];
// Read file.txt into an array, skipping empty lines.
foreach (file('file.txt', FILE_SKIP_EMPTY_LINES) as $line)
{
if ($line[0] !== '0')
$sieved[] = $line;
}
// Write out each array element, keeping the newlines from the input.
file_put_contents('cleanfile.txt', $sieved);
Комментарии:
1. Спасибо, я хотел проголосовать, но там сказано, что мне нужна репутация 15.. Я принял это вместо этого 🙂
Ответ №2:
Для развлечения, если файлы не огромны, это должно сработать. Считайте файл в массив, используйте grep для строк, не начинающихся с 0
, и запишите его в новый файл:
file_put_contents("cleanfile.txt", preg_grep('/^[^0]/', file("file.txt")));
Вы можете заменить grep фильтром:
array_filter(file("file.txt"), function($v) { return ($v[0] != 0); })