@Kvandaik

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

Есть текстовый файл в нём строки
1002;room10;info;gl
1002;room12;info;gl
1003;room13;info1;gl
1003;room14;info1;gl

и есть второй текстовый файл
stend0;code;2360;code2;5453;code3;1000
stend1;code;5551;code2;4444;code3;1002
stend1;code;5552;code2;4444;code3;1002
stend1;code;5553;code2;4444;code3;1002
stend1;code;5554;code2;4444;code3;1002
stend2;code;5331;code3;4443;code3;1003
stend2;code;5332;code3;4443;code3;1003
stend2;code;5333;code3;4443;code3;1003
stend2;code;5334;code3;4443;code3;1003

Пробую внести во второй файл соответствия по числу 1002==1002 итд, и записать в конец массива room.. получается так:
stend0;code;236;code2;5453;code3;1000
stend1;code;5551;code2;4444;code3;1002;room12
stend1;code;5552;code2;4444;code3;1002;room12
stend1;code;5553;code2;4444;code3;1002;room12
stend1;code;5554;code2;4444;code3;1002;room12
stend2;code;5331;code3;4443;code3;1003;room14
stend2;code;5332;code3;4443;code3;1003;room14
stend2;code;5333;code3;4443;code3;1003;room14
stend2;code;5334;code3;4443;code3;1003;room14

желаемый результат такой должен быть:
stend0;code;236;code2;5453;code3;1000
stend1;code;5551;code2;4444;code3;1002;room10
stend1;code;5552;code2;4444;code3;1002;room12
stend1;code;5553;code2;4444;code3;1002
stend1;code;5554;code2;4444;code3;1002
stend2;code;5331;code3;4443;code3;1003;room13
stend2;code;5332;code3;4443;code3;1003;room14
stend2;code;5333;code3;4443;code3;1003
stend2;code;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); // записывам из массива построчно в файл
}
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Ordec
У вас идет проверка только по $fp[6], неудивительно что он меняет все записи где колонка == 1002. Как я вижу, сделать так как вы хотите в этом коде нереально. Обновление записи должно идти по специфическому параметру, например по ID, или по group_ID. У вас же спец параметр это число 1002 которые может быть у дофига кого.

Что-бы сделать так как вы хотите, вам нужно добавить поддержку базы данных и обновлять по ID. Берете базу, заполняете ее. Затем просто пишете запросы на обновление бд и записываете все в ваш тхт файл если он вам так нужен.

UPD:
Пойдите от обратного, не к стендам приписывайте комнаты. А к комнатам стенды. Заведите массив комнаты
$Room = [
    'number' => 10
    'stands' => [
        'id' => [1, 2, 3]
    ]
]


Далее массив стендов

$Stand = [
    'id' => 'ваш ID',
    'code' => [5551, 4443, 1002]
]


Далее пробегаете по комнатам и обновляете поле stands.
Ответ написан
Tomio
@Tomio
backend developer (python, php)
Сначала превратите
1002;room10;info;gl
1002;room12;info;gl
1003;room13;info1;gl
1003;room14;info1;gl


в массив вида

$code3[1002] = ['room12'];
$code3[1003] = ['room13', 'room14'];


Затем строки

stend1;code;5551;code2;4444;code3;1002

соберите в массив

$stendRoomsCode = [
	1002 => [
		'stend1' => [
			'code' => 5551,
			'code2' => 4444,
			'code3' => 1002,
		]
	],
	1003 => [...]
];


После этого пробегитесь в цикле по массиву $stendRoomsCode и соберите строки

$newLines = '';
foreach ($stendRoomsCode as $codeId => $arStends) {
	foreach ($arStends as $stendName => $arCode) {
		$roomCounter = 0;
		foreach ($arCode as $codeName => $codeValue) {

			$newLines .= $stendName . ';'. $codeName . ';' . $codeValue
			
			if ($code3[$codeId] && $code3[$codeId][$roomCounter]) {
			    $codeValue .= ';' . $code3[$codeId][$roomCounter];
			}

			$newLines .= $stendName . ';'. $codeName . ';' . $codeValue . "\n";
			$roomCounter++;
		}
	}
}

echo $newLines;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы