Kuzma92
28.06.2024 - 14:48
Здравствуйте уважаемые специалисты.
Есть файл (us/db/fav/$us_id), этот файл ($us_id) содержит в себе строки типа:
aaa1
aaa2
aaa3
и т.д.
Есть папка (control/db_boys/rec/), в которой содержатся файлы типа:
aaa1
aaa2
aaa3
и т.д.
Т.е. строка файла "$us_id" = названию файла в папке "control/db_boys/rec/".
Подскажите, пожалуйста, как перебрать массив элементов файла "$us_id" таким образом, чтобы сравнить - существует ли файл в папке "control/db_boys/rec/" с таким же названием или нет. И в случае если нет, то из файла "$us_id" такую строчку удалить.
brevis
28.06.2024 - 14:58
https://chatgpt.com/share/b3808041-dcf4-4f1...81-b1f6ce980908<?php
$us_id = 'us/db/fav/your_us_id_file';
$dir = 'control/db_boys/rec/';
$lines = file($us_id, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $key => $line) {
if (!file_exists($dir . $line)) {
unset($lines[$key]);
}
}
file_put_contents($us_id, implode(PHP_EOL, $lines));
echo "Обработка завершена.";
?>
Я сам не проверял, но на первый взгляд что-то приемлемое.
_____________
Чатик в телеге
Kuzma92
28.06.2024 - 21:51
brevis, спасибо вам за ответ. И отдельное спасибо за комментарии. Один вопрос, скажите пожалуйста, чтобы при каждой загрузке страницы не перезаписывать файл, я могу сделать так?
$us_id = 'us/db/fav/your_us_id_file';
$dir = 'control/db_boys/rec/';
$lines = file($us_id, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $key => $line) {
if (!file_exists($dir . $line)) {
unset($lines[$key]);
file_put_contents($us_id, implode(PHP_EOL, $lines) . "\n");
}
}
FatCat
28.06.2024 - 23:08
Kuzma92
Перезаписывать файл в цикле? С какой целью?
Цитата (Kuzma92 @ 28.06.2024 - 19:51) |
чтобы при каждой загрузке страницы не перезаписывать файл, я могу |
… добавить условие работы этого кода.
_____________
Бесплатному сыру в дырки не заглядывают...
Kuzma92
30.06.2024 - 03:24
FatCat, извиняюсь за поздний ответ.
Не совсем понимаю. Ну как здесь получается, что если оставлять эту строку в цикле, то при каждом обновлении/загрузке страницы, файл перезаписывается/пересохраняется. Если же эту строку перенести в цикл, то файл перезаписывается только в том случае, если удаляется из него ненужная строка. Ну как бы по логике, как я понимаю, должно же быть так? Зачем перезаписывать и пересохранять файл при каждой загрузке страницы, если в нем не делаются изменения? Другой вопрос, правильно ли это так делать? Поэтому я и спросил:
Цитата (Kuzma92 @ 28.06.2024 - 21:51) |
я могу сделать так? |
Походу значит нежелательно так делать, раз вы говорите:
Цитата (FatCat @ 28.06.2024 - 23:08) |
добавить условие работы этого кода. |
но тогда как правильно написать это условие?
brevis
30.06.2024 - 06:14
Kuzma92, можно запомнить сколько строк в файле было сначала и сравнить это число с количеством строк после того, как мы проделали все проверки и удаления. Если число строк не совпадает -- значит были удаления и можем перезаписать файл:
<?php
$us_id = 'us/db/fav/your_us_id_file';
$dir = 'control/db_boys/rec/';
$lines = file($us_id, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$countLines = count($lines);
foreach ($lines as $key => $line) {
if (!file_exists($dir . $line)) {
unset($lines[$key]);
}
}
if ($countLines !== count($lines)) {
file_put_contents($us_id, implode(PHP_EOL, $lines));
}
echo "Обработка завершена.";
?>
Цитата |
Зачем перезаписывать и пересохранять файл при каждой загрузке страницы |
Это вопрос в правильном направлении. При загрузке каждой страницы и проверять существуют ли все файлы из списка зачастую бывает не оправданно. Более оправданно просто брать эти данные из кеша.
_____________
Чатик в телеге