chb1982
Goto Top

Array bei Bedarf Auffüllen

Moin,

ich hoffe hier nimmt sich jemand die Zet sich meinem Problem anzunehmen.
Unten ist ein kleines Script, das die Ausgabe von mehreren Spalten in eine Zusammenfasst.
In der Ausgangsdatei sind x Datensätze pro Auftragsnummer ($arKomPos[8]) und zwar so viele wie es Satzarten gibt ($arKomPos[33])

Die Ursprungstabelle sieht vereinfacht so aus:

Nummer - Satzart - Wert EK - Wert VK
4711 - 101 - 109,20 - 240, 30
4711 - 105 - 209,20 - 240, 30
4711 - 110 - 309,20 - 240, 30

4712 - 104 - 109,20 - 240, 30
4712 - 110 - 209,20 - 240, 30
4712 - 130 - 309,20 - 240, 30

Ziel soll sein jede Auftragsnummer in eine Zeile zu packen. Also

4711 - 101 - 109,20 - 105 - 209,20 - 110 - 309,20

Das bekommt das Script auch ganz toll hin.

Und jetzt kommt der Punkt.
Es gibt die Satzarten von 101 bis 130 durchgehend, aber sie werden nicht immer verwendet. Wenn sie nicht verwendet werden, sollen die Spalten mit 0 ausgegeben werden. Und das bekomme ich einfach nicht hin.

Anhand des Beispiels soll es also so aussehen.

4711 - 101 - 109,20 - 102 - 0 - 103 - 0 - 104 - 0 - 105 - 209,20


Kann mir jemand auf die Sprünge helfen wie ich das hinbekomme? Ich stehe schon am Rand der Verzweiflung!

Gruß
Christoph

Hier nun der Code

<?php
function convert_KomPos ($filename){
$last_kom = 0; Hilfsvariable Gruppenwechsel
$first_run = 1;
Satzarten
100, 101, 102, 103, 104, 110, 120, 121, 122, 124, 130, 131, 140

$x=1;

$fp=fopen("$filename","r");
$arKomSum=array();
while($arKomPos = fgetcsv($fp,8000,",")) {

$arKomSum[$arKomPos[8]][$arKomPos[33]][KomNr] = $arKomPos[8];
$arKomSum[$arKomPos[8]][$arKomPos[33]][KomSArt] = $arKomPos[33];
$arKomSum[$arKomPos[8]][$arKomPos[33]][KomEk.$arKomPos[33]] = $arKomPos[34] + $arKomSum[$arKomPos[8]][$arKomPos[33]][KomEk.$arKomPos[33]];
$arKomSum[$arKomPos[8]][$arKomPos[33]][KomVk.$arKomPos[33]] = $arKomPos[35] + $arKomSum[$arKomPos[8]][$arKomPos[33]][KomVk.$arKomPos[33]];
for($x=0;$x<33;$x++) {
$arKomSum[$arKomPos[8]][$arKomPos[33]][$x] = $arKomPos[$x];
}


}

$fp_write=fopen("kompos_hor.csv","w");

foreach($arKomSum as $temp1) {
Jede Kommissionsnummer
asort($temp1);
foreach($temp1 as $temp) { Jede Satzart
if($last_kom != $temp[KomNr]) {
for($x=0;$x<33;$x++) {
echo " - " . $temp[$x] . " ";
fwrite($fp_write, $temp[$x] . ",");
}
echo " KommNr:" . $temp[KomNr] . " SArt:" .$temp[KomSArt] . " EK:" . $temp[KomEk.$temp[KomSArt]] . " VK:" .$temp[KomVk.$temp[KomSArt]];
fwrite($fp_write, $temp[KomNr] ."," . $temp[KomSArt] . "," . $temp[KomEk] . "," . $temp[KomVk].",");
$last_kom = $temp[KomNr];
}
else {
echo " SArt:" .$temp[KomSArt] . " EK:" . $temp[KomEk.$temp[KomSArt]] . " VK:" .$temp[KomVk.$temp[KomSArt]];
fwrite($fp_write, $temp[KomSArt] . "," . $temp[KomEk] . "," . $temp[KomVk] . ",");
$last_kom = $temp[KomNr];
}
}
echo "<br><br>";
fwrite($fp_write, "\n");
}
fclose($fp_write);


}
?>

Content-Key: 100535

Url: https://administrator.de/contentid/100535

Printed on: April 24, 2024 at 04:04 o'clock

Member: Guenni
Guenni Nov 02, 2008 at 11:47:24 (UTC)
Goto Top
Hi Christoph,

ehrlich gesagt, blicke ich durch dein Script nicht durch, zumal du noch
eine Funktion convert_KomPos definiert hast, die aber im Script
nirgends aufgerufen wird :-O.
Hab' das Problem (hoffentlich) mal wie folgt gelöst.

<?
/*
Datei auftrag.txt zeilenweise einlesen, Beispiel:
4711-101-109,20-240,30
4711-105-209,20-240,30
4711-110-309,20-240,30
4712-104-109,20-240,30
4712-110-209,20-240,30
4712-130-309,20-240,30
4713-101-23,90-35,90
4713-110-101,90-139,90
4810-103-120,90-155,70
Hinweis: KEINE LEERZEILEN ZWISCHEN DEN AUFTRÄGEN
*/
$handle=fopen("auftrag.txt","r");  
while($line=fgets($handle)){
 $lines=$line;
}
fclose($handle);
/*
Jede Zeile als Array in einem Array ablegen
Die Elemente der Arrays können dann mit Hilfe
der folgenden Konstanten angesprochen werden
z.B.: array[index][SATZ]; array[index][EK] etc.
*/
foreach($lines as $line){
 $arr=explode("-",$line);  
}
/*
Einige Konstanten, um die Indexe der Arrays anzusprechen
*/
define('AUFTRAG',0);  
define('SATZ',1);  
define('EK',2);  
define('VK',3);  
/*
Die Auftragsnummern in ein Array ablegen und doppelte
Auftragsnummern entfernen
*/
foreach($arr as $el){
 $nr=$el[AUFTRAG];
}
$nr=array_unique($nr);
/*
Es existiert nun ein Array mit einmaligen Auftragsnummern
Die Arrays im Array $arr können nun mit den Auftragsnummern
angesprochen werden, die Elemente der Arrays mit den Konstanten
*/
$i=0;
foreach($nr as $el){
 $j=101;
 $auftrag="AuftragsNr: ".$el;  
 while($arr[$i][AUFTRAG]==$el){
  while($j<131){
		/*
		Wenn die SatzNr eines Arrays $j entspricht, werden SatzNr und EK an
		$auftrag angehangen. $i wird um 1 erhöht, um das nächste Array zu prüfen
		$j wird nicht verändert, da ja jedes Array eine eigene SatzNr hat.
		Innerhalb dieser Schleife wird also $j durchgezählt bis 130, $i aber nur solange
		die Bed. $arr[$i][AUFTRAG]==$el zutrifft.
		*/
    if($arr[$i][SATZ]==$j){
		 $auftrag.="-".$arr[$i][SATZ]."-".$arr[$i][EK];  
		 $i++;
		}else{
					//$auftrag.="-".$j."-0"; 
					/*
					Zur Abkürzung der Zeile wird hier nur die Null ohne SatzNr angehangen
					*/
					$auftrag.="-0";  
					}
		$j++;
  }
 }
 /*
 Auftragszeile mit Zeilenende in ein Array ablegen
 */
 $auftraege=$auftrag."\n";  
}
echo "Testausgabe der Auftragszeilen<pre>";  
print_r($auftraege);
echo "</pre>";  
/*
Auftraege in Datei schreiben
*/
$handle=fopen("pub/auftrag.txt","w");  
foreach($auftraege as $auftrag){
 fwrite($handle,$auftrag);
}
fclose($handle);
?>

Gruß
Günni