[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как удалить из массива ненужные строки?
Страницы: 1, 2
Kuzma92
Здравствуйте уважаемые специалисты.

Есть файл (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
https://chatgpt.com/share/b3808041-dcf4-4f1...81-b1f6ce980908

<?php
// Путь к файлу $us_id
$us_id = 'us/db/fav/your_us_id_file'; // Замените 'your_us_id_file' на нужное имя файла

// Путь к папке с файлами

$dir = 'control/db_boys/rec/';

// Читаем содержимое файла $us_id
$lines = file($us_id, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

// Проверяем каждую строку в файле $us_id
foreach ($lines as $key => $line) {
// Если файл с таким именем не существует в папке, удаляем строку из массива
if (!file_exists($dir . $line)) {
unset($lines[$key]);
}
}


// Записываем обновленный массив обратно в файл $us_id
file_put_contents($us_id, implode(PHP_EOL, $lines));

echo "Обработка завершена.";
?>


Я сам не проверял, но на первый взгляд что-то приемлемое.

_____________
Чатик в телеге
Kuzma92
brevis, спасибо вам за ответ. И отдельное спасибо за комментарии. Один вопрос, скажите пожалуйста, чтобы при каждой загрузке страницы не перезаписывать файл, я могу сделать так?

$us_id = 'us/db/fav/your_us_id_file'; // Замените '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
Kuzma92
Перезаписывать файл в цикле? С какой целью?


Цитата (Kuzma92 @ 28.06.2024 - 19:51)
чтобы при каждой загрузке страницы не перезаписывать файл, я могу

… добавить условие работы этого кода.

_____________
Бесплатному сыру в дырки не заглядывают...
Kuzma92
FatCat, извиняюсь за поздний ответ.
Не совсем понимаю. Ну как здесь получается, что если оставлять эту строку в цикле, то при каждом обновлении/загрузке страницы, файл перезаписывается/пересохраняется. Если же эту строку перенести в цикл, то файл перезаписывается только в том случае, если удаляется из него ненужная строка. Ну как бы по логике, как я понимаю, должно же быть так? Зачем перезаписывать и пересохранять файл при каждой загрузке страницы, если в нем не делаются изменения? Другой вопрос, правильно ли это так делать? Поэтому я и спросил:
Цитата (Kuzma92 @ 28.06.2024 - 21:51)
я могу сделать так?

Походу значит нежелательно так делать, раз вы говорите:
Цитата (FatCat @ 28.06.2024 - 23:08)
добавить условие работы этого кода.

но тогда как правильно написать это условие?
brevis
Kuzma92, можно запомнить сколько строк в файле было сначала и сравнить это число с количеством строк после того, как мы проделали все проверки и удаления. Если число строк не совпадает -- значит были удаления и можем перезаписать файл:
<?php
// Путь к файлу $us_id
$us_id = 'us/db/fav/your_us_id_file'; // Замените 'your_us_id_file' на нужное имя файла

// Путь к папке с файлами

$dir = 'control/db_boys/rec/';

// Читаем содержимое файла $us_id
$lines = file($us_id, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// UPD 1: запоминаем сколько строк в файле было изначально
$countLines = count($lines);

// Проверяем каждую строку в файле $us_id
foreach ($lines as $key => $line) {
// Если файл с таким именем не существует в папке, удаляем строку из массива
if (!file_exists($dir . $line)) {
unset($lines[$key]);
}
}


// Записываем обновленный массив обратно в файл $us_id
// UPD 2: если были удаления строк (количество строк сейчас не совпадает с тем, что было изначально)

if ($countLines !== count($lines)) {
file_put_contents($us_id, implode(PHP_EOL, $lines));
}

echo "Обработка завершена.";
?>


Цитата
Зачем перезаписывать и пересохранять файл при каждой загрузке страницы

Это вопрос в правильном направлении. При загрузке каждой страницы и проверять существуют ли все файлы из списка зачастую бывает не оправданно. Более оправданно просто брать эти данные из кеша.

_____________
Чатик в телеге
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.