Заменить значение массива по порядку

242
26 сентября 2021, 04:00

ps Задача усложнилась...

Есть текстовый файл в нём строки

1002;room10;info;gl
1002;room12;info;gl
1003;room13;info1;gl
1003;room14;info1;gl

и есть второй текстовый файл

25;stend0;2360;code2;5453;code3;1000
28;stend1;5551;code2;4444;code3;1002
29;stend1;5552;code2;4444;code3;1002
30;stend1;5553;code2;4444;code3;1002
31;stend1;5554;code2;4444;code3;1002
48;stend2;5331;code3;4443;code3;1003
49;stend2;5332;code3;4443;code3;1003
50;stend2;5333;code3;4443;code3;1003
51;stend2;5334;code3;4443;code3;1003

Пробую внести во второй файл соответствия по числу 1002==1002 итд, и записать в конец массива room.. получается так:

25;stend0;236;code2;5453;code3;1000
28;stend1;5551;code2;4444;code3;1002;room12
29;stend1;5552;code2;4444;code3;1002;room12
30;stend1;5553;code2;4444;code3;1002;room12
31;stend1;5554;code2;4444;code3;1002;room12
48;stend2;5331;code3;4443;code3;1003;room14
49;stend2;5332;code3;4443;code3;1003;room14
50;stend2;5333;code3;4443;code3;1003;room14
51;stend2;5334;code3;4443;code3;1003;room14

желаемый результат:

25;stend0;236;code2;5453;code3;1000
28;stend1;5551;code2;4444;code3;1002;room10
29;stend1;5552;code2;4444;code3;1002;room12
30;stend1;5553;code2;4444;code3;1002
31;stend1;5554;code2;4444;code3;1002
48;stend2;5331;code3;4443;code3;1003;room13
49;stend2;5332;code3;4443;code3;1003;room14
50;stend2;5333;code3;4443;code3;1003
51;stend2;5334;code3;4443;code3;1003
$file1 = fopen('table.txt', "r");
//$file2= fopen("products.csv", "r");
$files = array($file1);
    foreach($files as $file){
    while (($line = fgets($file)) !== false) {
    $Data[]= explode(';',trim($line));
  }
}

# code...
$file1 = fopen('tablfinsh.txt', 'r');
$files = array($file1);
foreach ($files as $file) {
    while (($line = fgets($file)) !== false) {
        $value[] = explode(';', trim($line)); //создаём массив данных перед удалением содержимого из файла
    }
}
$handle = fopen('tablfinsh.txt', 'w+'); // Открыть файл, сделать его пустым
sleep(1);
fclose($handle);
foreach ($value as $key => $value1) {
 $fp = $value[$key];
    foreach ($Data as $key1 => $sec) {
        if ($value1[6] === $sec[0]) {
                $fp[7] = $sec[1];
        }
    }
    $toBeSaved = implode(';', $fp);
    file_put_contents('tablfinsh.txt', $toBeSaved . "\r\n", FILE_APPEND | LOCK_EX); // записывам из массива построчно в файл
}
Answer 1
$exp = function ($x) { return explode(';', $x);};
$group = function ($arr, $key, $val=Null) {
    $res = [];
    foreach($arr as $x) {
        $res[$key($x)][] = is_null($val) ? $x : $val($x);
    }
    return $res;
};
// Собственно, всё делается здесь
$merge = function ($x) use(&$file1, $exp) {
    // разбиваем по разделителям
    $x = $exp($x);
    // Берем последний элемент
    $ind = end($x);
    // Пока sub-array не пуст
    if(! empty($file1[$ind])) {
        // добавляем значение в хвост
        array_push($x, ...(array) array_shift($file1[$ind]));
    }
    // Собираем в строку
    return implode(';',$x);
};
// Читаем файл
$file1 = file('table.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
// Разбиваем по разделителям
$file1 = array_map($exp, $file1);
// Группируем вторые элементы по значению первого
$file1 = $group($file1, 'array_shift', 'array_shift');
// Читатем второй файл
$file2 = file('tablfinsh.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
// Добавляем из первого
$file2 = array_map($merge, $file2);
// Записывем результат
file_put_contents('tablfinsh.txt', implode(PHP_EOL, $file2));

UPDATE: я сделал функции чуть универсальнее. Выше все работает по старому, а если заменить одну строку

$file1 = $group($file1, 'array_shift');

будет то, что вы спросили в комментарии

READ ALSO
Как использовать переменные заданные в другом файле?

Как использовать переменные заданные в другом файле?

Есть определенные переменные, которые везде одинаковые, и которые можно вынести в отдельный файлКак мне в файле config

158
Поиск значения внутри масссива

Поиск значения внутри масссива

Коллеги, добрый деньЯ недавно занимаюсь разработкой на php и столкнулся с подобной проблемой

251
Вывод в цикле лишь одного элемента (php) с определенным id

Вывод в цикле лишь одного элемента (php) с определенным id

есть цикл, в нем выводяться записи с базы данных, в нем есть следующее условие "{% if loopindex != 1 and loop

90
Как вывести подкатегории?

Как вывести подкатегории?

Имеется модель категорий

76