Как сделать возврат

122
18 сентября 2021, 10:00

Есть текст в файле

1;A;B;C;D;F;E
1;A;B;C;D;F;G

я его граблю, создаю массив из данных в тексте, потом изменяю массив, и добавляю опять в файл, но происходит дублирование в текстовом файле как будто удаление $handle происходит один раз;

1;A;B;C;D;F;E
1;A;B;C;D;F;G;Dobavleno
1;A;B;C;D;F;E;Dobavleno
1;A;B;C;D;F;G;Dobavleno

Как прикрутить return или обернуть в функцию? Желаемый итоговый результат:

1;A;B;C;D;F;E;Dobavleno
1;A;B;C;D;F;G;Dobavleno

Логика:

    $Data=array('E','G'); //массив для поиска в тексте
    foreach ($Data as $key1 => $sec) {
        # code...   
   $file1 = fopen("test.txt", "r");
   $files = array($file1);
        foreach($files as $file){
        while (($line = fgets($file)) !== false) {
        $value[]= explode(';',trim($line)); //создаём массив данных перед удалением содержимого из файла
      }
    }
     $handle = fopen("test.txt","w+"); // Открыть файл, сделать его пустым
    sleep(1);
    fclose($handle);
    foreach ($value as $key => $value1) {
    $fp=$value[$key];
    if($value1[6]==$sec){
    if(isset($value1[7])){
       $fp=array_replace($fp, array('7'=>"Dobavleno")); 
    }else{
      $fp=array_replace($fp, array('7'=>"Dobavleno")); //изменяем массив 
         }
    }
    $toBeSaved = implode(';',$fp); 
    file_put_contents('test.txt', $toBeSaved."\r\n", FILE_APPEND | LOCK_EX); // записывам из массива построчно в файл
    }
    }
Answer 1

Ну во первых вы в двух циклах каждый раз открываете файл и записываете строки. И сам foreach так же местами надо поменять. Вам надо в каждой строке из файла искать данные из массива для поиска. Значит сначала идем по строчкам, потом в каждой из них ищем нужную букву. Если есть - добавляем, уже после того как поискали все буквы из массива для поиска можно записать новую строчку в файл.

$Data = array('E', 'G'); //массив для поиска в тексте
# code...
$file1 = fopen('test.txt', 'r');
$files = array($file1);
foreach ($files as $file) {
    while (($line = fgets($file)) !== false) {
        $value[] = explode(';', trim($line)); //создаём массив данных перед удалением содержимого из файла
    }
}
$handle = fopen('test.txt', 'w+'); // Открыть файл, сделать его пустым
sleep(1);
fclose($handle);
foreach ($value as $key => $value1) {
    $fp = $value[$key];
    foreach ($Data as $key1 => $sec) {
        if ($value1[6] === $sec) {
            if (isset($value1[7])) {
                $fp[7] = 'Dobavleno';
            } else {
                $fp[7] = 'Dobavleno'; //изменяем массив
            }
        }
    }
    $toBeSaved = implode(';', $fp);
    file_put_contents('test.txt', $toBeSaved . "\r\n", FILE_APPEND | LOCK_EX); // записывам из массива построчно в файл
}
Answer 2

какой-то у вас сложный, и местами нелогичный код (одинаковые ветки if-else). Зачем это построчное чтение, если вы все равно весь файл в память загружаете?

$haystack = ['E', 'G'];
$data = file("test.txt");
foreach($data as &$l){
    $tmp = explode(';', $l);
    if(in_array($tmp[6], $haystack)) continue;
    $l = trim($l) . ";append\r\n";
}    
file_put_contents("test.txt", implode('', $data));
READ ALSO
systemd - php worker

systemd - php worker

Подскажите пожалуйста, как через systemd линукса создать php-worker ?

95
Отправка 2 форм 1 запросом

Отправка 2 форм 1 запросом

В общем - у меня на странице есть 2 формыОни в разных местах страницы и даже в разных файлах темы

80
Передать id в форму

Передать id в форму

Есть таблица с кнопками на всплывающую форму, id берет с БД

94