Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Как удалить из массива ненужные строки?
Kuzma92  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 15 дней
Карма:




Здравствуйте уважаемые специалисты.

Есть файл (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" такую строчку удалить.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
brevis  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 690
Пользователь №: 39616
На форуме: 10 лет, 10 месяцев, 8 дней
Карма: 71




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 "Обработка завершена.";
?>


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


--------------------
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kuzma92  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 15 дней
Карма:




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");
}
}
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



חשב את עצמו
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 6963
Пользователь №: 1
На форуме: 19 лет, 1 месяц, 15 дней
Карма: 145




Kuzma92
Перезаписывать файл в цикле? С какой целью?


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

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


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kuzma92  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 15 дней
Карма:




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

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

но тогда как правильно написать это условие?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
brevis  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 690
Пользователь №: 39616
На форуме: 10 лет, 10 месяцев, 8 дней
Карма: 71




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 "Обработка завершена.";
?>


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

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


--------------------
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



חשב את עצמו
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 6963
Пользователь №: 1
На форуме: 19 лет, 1 месяц, 15 дней
Карма: 145




Цитата (Kuzma92 @ 30.06.2024 - 01:24)
Если же эту строку перенести в цикл, то файл перезаписывается только в том случае, если удаляется из него ненужная строка.

А если в файле лиш6ие сотни строк — сотни перезаписей.
В цикле лучше не перезаписывать файл а фиксировать, есть ли изменения. Как-то так:
$flag = FALSE; 

//Начало цикла
if (!file_exists($dir . $line))
{
unset($lines[$key]);
$flag = TRUE; //фиксируем, что есть изменение
}
//Конец цикла
if($flag) //если изменился, пишем файл
file_put_contents($us_id, implode(PHP_EOL, $lines));


PS: Ну и, чтобы каждой страницей не мучать файловую систему, весь этот код поместить на отдельную страницу, которую будешь открывать только тогда, когда нужно.

Это сообщение отредактировал FatCat - 30.06.2024 - 17:07


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kuzma92  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 15 дней
Карма:




brevis
FatCat
Цитата (brevis @ 30.06.2024 - 06:14)
можно запомнить сколько строк в файле было сначала и сравнить это число с количеством строк после того, как мы проделали все проверки и удаления. Если число строк не совпадает -- значит были удаления и можем перезаписать файл

да, точно же.. как же я сразу не догадался об этом?
Цитата (FatCat @ 30.06.2024 - 16:17)
В цикле лучше не перезаписывать файл а фиксировать, есть ли изменения

ну да, меня это и смущало, поэтому и задал этот вопрос.

ой братцы, огромное спасибо за помощь и полезную для меня информацию!

Пошел писать код под себя. Всем успехов!
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kuzma92  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 15 дней
Карма:




$rec = 'control/db_boys/rec/';
// Читаем содержимое файла закладок
$lines = file('us/db/fav_boys/'.$us_id.'', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// запоминаем сколько строк в файле было изначально
$countLines = count($lines);
// Проверяем каждую строку в файле закладок
foreach ($lines as $key => $line) {
// Если файл с таким именем не существует в папке, удаляем строку из массива
if (!file_exists($rec . $line)) {
unset($lines[$key]);
}
}

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

if ($countLines !== count($lines)) {
file_put_contents('us/db/fav_boys/'.$us_id.'', implode(PHP_EOL, $lines) . "\n");
}


Извиняюсь, вынужден поднять эту тему снова. Всё бы хорошо. Но есть один момент, самостоятельно не удается решить задачу.

Если в папке
control/db_boys/rec/
какой либо файл отсутствует, который имеется в файле
us/db/fav_boys/'.$us_id.'
то файл успешно перезаписывается, и пустые строки отсутствуют, за исключением последней. Здесь всё хорошо.

Но, когда скажем в файле остается только одна заполненная строка, например:
123456789
и внизу каретка

..и удаляется этот (123456789) файл из папки control/db_boys/rec/

..то после этого в файле us/db/fav_boys/'.$us_id.' остается две пустые строки, вместо одной.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
don.bidon  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 54
Пользователь №: 46417
На форуме: 2 года, 26 дней
Карма:




Кузьма, перестань изобретать велосипеды и чутка про базы данных почитай, в твоём случае даже SQLite годна будет. Файлы в файлухе, данные в базе данных )
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
brevis  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 690
Пользователь №: 39616
На форуме: 10 лет, 10 месяцев, 8 дней
Карма: 71




Kuzma92, похоже, что каретки накапливаются из-за добавления \n тут:
implode(PHP_EOL, $lines) . "\n"

Если тебе прям очень нужна новая строка в конце, то может помочь просто оборачивание implode(...) в trim():
implode(PHP_EOL, $lines) . "\n" ---> trim(implode(PHP_EOL, $lines)) . "\n"

А так, вообще, я присоединяюсь к предыдущему оратору. Если конечно у тебя не стоит цель написать скрипт с наибольшим количеством костылей и тд.


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kuzma92  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 15 дней
Карма:




brevis, спасибо вам за полезный совет, теперь буду знать. Спасибо!
Цитата (don.bidon @ 15.07.2024 - 06:33)
Кузьма, перестань изобретать велосипеды и чутка про базы данных почитай, в твоём случае даже SQLite годна будет. Файлы в файлухе, данные в базе данных )

don.bidon, спасибо вам за совет. Конечно, и к БД перейду. Нисколько не спорю, просто.. ну всё нужно попробовать.
Цитата (brevis @ 15.07.2024 - 12:42)
Если конечно у тебя не стоит цель написать скрипт с наибольшим количеством костылей и тд.

Нет, такой цели нет))

Братцы, конечно вы правы. Вот и планирую сейчас сделать этот сайт на файлах, а следующий уже осваивать с полноценной БД. Для мелких сайтов думаю, что mysql незачем, а вот SQLite или что-то подобное, что попроще, в самый раз. Буду благодарен и за полезные советы, касаемо того, какую БД лучше и проще всего использовать для сайтов, содержащих не более трех-пяти сот страниц и проходимостью не более тысячи посетителей в день.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



חשב את עצמו
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 6963
Пользователь №: 1
На форуме: 19 лет, 1 месяц, 15 дней
Карма: 145




Цитата (Kuzma92 @ 15.07.2024 - 13:46)
Буду благодарен и за полезные советы, касаемо того, какую БД лучше и проще всего использовать для сайтов

Ту, которая есть у всех хостеров.


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 6460
Пользователь №: 35718
На форуме: 12 лет, 4 месяца, 2 дня
Карма: 208




Я так и не понял главного, зачем хранить название файлов из директории в отдельном файле?


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



חשב את עצמו
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 6963
Пользователь №: 1
На форуме: 19 лет, 1 месяц, 15 дней
Карма: 145




Цитата (Valick @ 17.07.2024 - 08:24)
Я так и не понял главного, зачем хранить название файлов из директории в отдельном файле?

Как я понял, сама идея правильная, и была бы хороша, если бы реализовалась на БД, а не на файлах.

Например, форум. Самую большую нагрузку дают просмотры топиков. Для отображения топика нужна информация о пользователе: ник, айдишник (для ссылки на профиль), количество сообщений, дата регистрации. Это и хранится в таблице members. А редко требующаяся информация, как то день рождения, увлечения, настройки журнала и прочая дребедень, хранится в таблице members_extra, и джойнится только по мере необходимости.

Так и у него на файлах, только вместо таблицы members файл members, а вместо таблицы members_extra директория с файлами, где каждый файл сопоставлен каждому пользователю.


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса