Масивы и построчное чтение

P
На сайте с 14.05.2012
Offline
35
469

В общем суть такова: я парсю файл foareach'ем


$file = file('data.bin');

foreach ($file as $key => $string){

}

внутри каждого цикла foareach происходит "отбор" строк


$string = explode(":", $string);

switch ($string[0]):
case 'DS':
echo 'DS';
break;
case 'AD':
echo 'AD';
break;

то есть если строка начинается с DS выполнить то действие, с DS другое и тд и тд.

Так вот строка DS имеет примерно следующий вид: "DS:00081;30,5C" . И действие которое нужно произвести когда "приходит" строка с меткой DS, заключается в том чтобы взять часть строки "30,5C" ...


$data = explode(";", $string[1]);
//$data[0]; //номер пакета "00081"
//$data[1]; //собственно нужные данные "30,5C"

... и записать в массив $ds вида


$ds = array("номер пакета" => "данные");

Суть проблемы в том что каждый цикл создает новый массив $ds и добавляет новое значение в конец.


Array
(
[00001] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

[00003] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

[00003] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

[00003] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

[00003] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

[00003] => 0,0C

)
Array
(
[00001] => 0,0C

[00002] => 0,0C

[00003] => 0,0C

)

вот примерно то что выдает а вот то что должно быть


Array
(
[00001] => 0,0C

[00002] => 0,0C

[00003] => 0,0C

[00004] => 0,0C

[00005] => 0,0C

[00006] => 0,0C

[00007] => 0,0C

[00008] => 0,0C

[00009] => 0,0C

[00010] => 0,0C

[00011] => 0,0C

[00012] => 0,0C

[00013] => 8,0C

[00014] => 8,0C

[00015] => 8,0C

[00017] => 8,0C

[00018] => 8,0C

)

один единственный ассоциативный массив с кучей данных

Вот тут полный код


<?
$file = file('data.bin');

$skip = 24;//пропустить "ненужные" строки


foreach ($file as $key => $string){

if ($key <= $skip){ continue; } //выбираем не нужные первые чтроки и пропускаем их

$string = explode(":", $string);

switch ($string[0]):
case 'DS':
$data = explode(";", $string[1]);
//$data[0]; //номер пакета
//$data[1]; //данные

//а тут мы создаем массив $ds[$data[0]] = $data[1]; или же так $ds = array("$data[0]" => "$data[1]");

break;

case 'AD':
//echo 'AD';
break;



default:
//echo 'NotData:'.$string[0];
endswitch;


print_r($ds);

}
?>

Тут в приложении есть data.bin

Спасибо за внимание господа =)

bay_ebook
На сайте с 28.05.2010
Offline
111
#1

$ds = array("номер пакета" => "данные");

меняем на

$ds[] = array("номер пакета" => "данные");

что-то я добрый сегодня :)

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
Koleman
На сайте с 26.10.2010
Offline
46
#2

$ds['номер пакета'] = "данные";

и print_r выводить после foreach

Изготовление сайтов под ключ, верстка (/ru/forum/811897) - отзывы
XL
На сайте с 16.01.2007
Offline
88
#3

Сократил до этого:


$file_handler = fopen("data.bin", "r");

while (!feof($file_handler)) {
$line = fgets($file_handler);

if(preg_match('/^DS/', $line)){
$data_arr = explode(';', $line);
echo "<p><b>Номер пакета: </b>".$data_arr[0]."; <b>данные: </b>".$data_arr[1]."</p>";
}
}
P
На сайте с 14.05.2012
Offline
35
#4

Проблема решена, спасибо

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий