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); // записывам из массива построчно в файл
}
$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');
будет то, что вы спросили в комментарии
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть определенные переменные, которые везде одинаковые, и которые можно вынести в отдельный файлКак мне в файле config
Коллеги, добрый деньЯ недавно занимаюсь разработкой на php и столкнулся с подобной проблемой
есть цикл, в нем выводяться записи с базы данных, в нем есть следующее условие "{% if loopindex != 1 and loop