Dodanie wiersza z sumowaniem kolumn tabeli

0

Witajcie,

mam tabelę, która tworzona jest przez import danych z pliku tekstowego. Tabela ma 5 kolumn i w zależności od liczby danych (ilości linii w plików) odpowiednią ilość wierszy. Potrzebuję po 10 wierszach dodać kolejny wiersz z sumowaniem danych znajdujących się powyżej (w każdej kolumnie) i od razu lecieć dalej z następną ilością danych. Niestety poległem. Czy ktoś jest w stanie pomóc podsuwając rozwiązaznie?

 <?php
            $plik = "test.txt";
            $handle = fopen( $plik,"r" );
 
            if( $handle ) {
            $c = 0;
            $lines = array();

            while ( ( $line = fgets( $handle ) ) !== false ) {
            // $lines[] = $line; // wczytaj do tablicy

            if( preg_match( '/^\|/', $line, $match ) ) {
               
                $c++;
                if( $c <= 1 ) continue;
               
                $cols = explode( '|', trim( $line, '|' ) );
                if( count( $cols ) > 6 )  {
                    // var_dump($line);
                    echo '<tr>';
                        for( $i = 1; $i < count( $cols ) - 1; $i++ ) {
                            echo '<td class="' . $class . '">' . trim( $cols[$i] ) . '</td>';
                        }
                    echo '</tr>';
                }
               
            }
            }
            fclose($handle);
       
            } else {
            }
            fclose($file);
            ?>

0

A możesz podrzucić strukturę tych danych z tego pliku?
Jak to wrażliwe dane to po prostu ją odwzoruj, żebyśmy wiedzieli z czym mamy do czynienia

0
Lorem ipsum dolor   
 
Lorem ipsum dolor                               
Lorem ipsum dolor                   
                 Lorem ipsum dolor                                
 
Lorem ipsum dolor           
Lorem ipsum dolor   
Lorem ipsum dolor   
Lorem ipsum dolor                
Lorem ipsum dolor                                                                                                                    


! 
+----+---------------+-----------------+-----------------+-----------------+-----------------+
| Lp |    Data       |     Dane 1     |     Dane 2     |      Dane 3     |        Dane 4     |
+----+---------------+-----------------+-----------------+-----------------+-----------------+
|    | 2017.11.15 r |      -80 000.00T|                 |                 |       80 000.00 | 
|  1 | 2017.12.31 Ni |                 |          466.65 |          466.65 |       80 000.00 | 
|  2 | 2018.01.31 r |          524.00 |          307.72 |          831.72 |       79 476.00 | 
|  3 | 2018.02.28 r |          444.00 |          276.13 |          720.13 |       79 032.00 | 
|  4 | 2018.03.31 So |          444.00 |          304.01 |          748.01 |       78 588.00 | 
|  5 | 2018.04.30 Po |          444.00 |          292.55 |          736.55 |       78 144.00 | 
|  6 | 2018.05.31 Cz |          444.00 |          300.59 |          744.59 |       77 700.00 | 
|  7 | 2018.06.30 So |          444.00 |          289.25 |          733.25 |       77 256.00 | 
|  8 | 2018.07.31 Wt |          444.00 |          297.18 |          741.18 |       76 812.00 | 
|  9 | 2018.08.31 Pi |          444.00 |          295.47 |          739.47 |       76 368.00 | 
| 10 | 2018.09.30 Ni |          444.00 |          284.28 |          728.28 |       75 924.00 | 
0

Looknij to czy zadziała

<?php
$cols=6;
$sumBreak=10;

$lines = file('source.txt');
$output=array('heading'=>array(),'data'=>array());

foreach($lines as $key=>$line)
{
	if(strpos($line,'Lp'))
	{ 
		$output['heading']=explode("|",$line); 
		$output['heading']=array_map('trim',$output['heading']);
		$output['heading']=array_filter($output['heading']);
		break;
	}
}

$output['data']=array_slice($lines,$key+3);
$output['data']= array_map(function($val) 
{ 
	$val=explode('|',$val);
	$val=array_map('trim',$val);
	$val=array_filter($val);
	return $val; 
}, $output['data']);

?>
<table>
	<thead>
		<tr>
			<?php print '<th>'.implode('</th><th>',$output['heading']).'</th>'; ?>
		</tr>
	</thead>
	<tbody>
		<?php $tempSum=array_fill(3,$cols,0); ?>
		<?php foreach($output['data'] as $key=>$row): ?>
			<tr>
				<?php print '<td>'.implode('</td><td>',$row).'</td>'; ?> 
				<?php foreach($row as $index=>$val): ?>
					<?php  
						if($index>2&&$index<7) { $tempSum[$index]+=floatval(str_replace(' ','',$val)); } 
					?>
				<?php endforeach; ?>
				<?php if($key%$sumBreak==$sumBreak-1): ?>
					 <tr>
					 	<td colspan="2">SUM</td>
					 	<?php $tempSum=array_filter($tempSum); ?>
					 	<?php foreach($tempSum as $sum): ?><td><?php print number_format($sum,2,"."," "); ?></td><?php endforeach; ?>
					 	<?php $tempSum=array_fill(3,$cols,0); ?>
					 </tr>
				<?php endif; ?>
			</tr>
		<?php endforeach; ?>
		<tr>
		 	<td colspan="2">SUM</td>
		 	<?php $tempSum=array_filter($tempSum); ?>
		 	<?php foreach($tempSum as $sum): ?><td><?php print number_format($sum,2,"."," "); ?></td><?php endforeach; ?>
		</tr>
	</tbody>
</table>
0
hapertown napisał(a):

Looknij to czy zadziała

<?php
$cols=6;
$sumBreak=10;

$lines = file('source.txt');
$output=array('heading'=>array(),'data'=>array());

foreach($lines as $key=>$line)
{
	if(strpos($line,'Lp'))
	{ 
		$output['heading']=explode("|",$line); 
		$output['heading']=array_map('trim',$output['heading']);
		$output['heading']=array_filter($output['heading']);
		break;
	}
}

$output['data']=array_slice($lines,$key+3);
$output['data']= array_map(function($val) 
{ 
	$val=explode('|',$val);
	$val=array_map('trim',$val);
	$val=array_filter($val);
	return $val; 
}, $output['data']);

?>
<table>
	<thead>
		<tr>
			<?php print '<th>'.implode('</th><th>',$output['heading']).'</th>'; ?>
		</tr>
	</thead>
	<tbody>
		<?php $tempSum=array_fill(3,$cols,0); ?>
		<?php foreach($output['data'] as $key=>$row): ?>
			<tr>
				<?php print '<td>'.implode('</td><td>',$row).'</td>'; ?> 
				<?php foreach($row as $index=>$val): ?>
					<?php  
						if($index>2&&$index<7) { $tempSum[$index]+=floatval(str_replace(' ','',$val)); } 
					?>
				<?php endforeach; ?>
				<?php if($key%$sumBreak==$sumBreak-1): ?>
					 <tr>
					 	<td colspan="2">SUM</td>
					 	<?php $tempSum=array_filter($tempSum); ?>
					 	<?php foreach($tempSum as $sum): ?><td><?php print number_format($sum,2,"."," "); ?></td><?php endforeach; ?>
					 	<?php $tempSum=array_fill(3,$cols,0); ?>
					 </tr>
				<?php endif; ?>
			</tr>
		<?php endforeach; ?>
		<tr>
		 	<td colspan="2">SUM</td>
		 	<?php $tempSum=array_filter($tempSum); ?>
		 	<?php foreach($tempSum as $sum): ?><td><?php print number_format($sum,2,"."," "); ?></td><?php endforeach; ?>
		</tr>
	</tbody>
</table>

Dziękuję za pomoc, ale niestety nie działa jakbym chciał. Rozwala układ mojej tabeli oraz dodaje podsumowanie co 10 wiersz. Ja chciałbym jedynie dodać podsumowanie po pierwszych 10 wierszach.

0

No to już chyba sobie przerobisz tak, żeby pasowało Ci do Twojej tabelki (trzeba wstawić odpowiednie tagi HTML w odpowiednie miejsca), a z tym, żeby tylko po pierwszych 10 wierszach to wystarczy zmienić

if($key%$sumBreak==$sumBreak-1):

na

if($key==9):

a na końcu usunąć to renderowanie wiersza sumującego i już.

No tyle to chyba dasz radę zrobić..

0
hapertown napisał(a):

No to już chyba sobie przerobisz tak, żeby pasowało Ci do Twojej tabelki (trzeba wstawić odpowiednie tagi HTML w odpowiednie miejsca), a z tym, żeby tylko po pierwszych 10 wierszach to wystarczy zmienić

if($key%$sumBreak==$sumBreak-1):

na

if($key==9):

a na końcu usunąć to renderowanie wiersza sumującego i już.

No tyle to chyba dasz radę zrobić..

Niestety w moim przypadku nie jest to proste, ponieważ za odpowiednie formatowanie tabeli przy imporcie odpowiada poniższy kod:

			if( $handle ) {
			$c = 0;
			$lines = array();
			// dla kazdej linni z pliku
			while ( ( $line = fgets( $handle ) ) !== false ) {
            // $lines[] = $line; // wczytaj do tablicy
             // zwieksz ilosc linii
            if( preg_match( '/^\|/', $line, $match ) ) {
                
                $c++;
                if( $c <= 1 ) continue;
                
                $cols = explode( '|', trim( $line, '|' ) );
                if( count( $cols ) > 6 )  {
                    // var_dump($line);
                    echo '<tr>';
                        for( $i = 1; $i < count( $cols ) - 1; $i++ ) {
                            echo '<td class="' . $class . '">' . trim( $cols[$i] ) . '</td>';
                        }
                    echo '</tr>';
                }

To on tworzy odpowiednio kolumny oraz wiersze, analizując znaki | obecne w moim pliku test.txt. Czy mogę liczyć na pomoc w implementacji tego rozwiązania w Twoim kodize?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.