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);
}
?>
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);
}
?>
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 100535
Url: https://administrator.de/forum/array-bei-bedarf-auffuellen-100535.html
Ausgedruckt am: 07.04.2025 um 20:04 Uhr
1 Kommentar
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.
Gruß
Günni
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