Exceldatei einlesen/auswerten und in neues Array schreiben

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
phpfrage
Mitglied
Beiträge: 4
Registriert: 20.05.2015 15:26

Exceldatei einlesen/auswerten und in neues Array schreiben

Beitrag von phpfrage »

Hallo, ich hole mir sämtlich Daten aus einer Exceldatei, die Daten werden
in einem großen Array $rohdatenEXC gespeichert. Jede Spalte der Exceldatei
kann als Array angesprochen werden. Es ist mir bisher gelungen nach Mitarbeiter
zu filtern (Spalte E) und deren Gesamtstunden (Spalte O) auszugeben.

Nun gibt es aber auch noch eine (Spalte N) in der die Art der Leistung vermerkt ist.
Anhand der switch_Methode will ich prüfen ob der Wert in der Spalte N auf "Urlaub"
oder "Krank" steht --> wenn dies der Fall ist, soll er in dem Array $auswertung in den
Index"Urlaub" oder Index"Krank" den Wert von der Spalte O schreiben und entsprechend
aufsummieren. Bei der Ausgabe erhalte ich dann aber die Meldungen undefiniert Index "Urlaub" und "Krank"

Mein code wäre folgender:

Code: Alles auswählen

$rohdatenEXC = array(); //gesamte Inhalt der Exceldatei, alle Spalten sind in Arrays gespeichert

foreach($sheetData as $key => $rohdatenEXC){
 // $rohdatenEXC['E']; //Spalte E = Nachname
 // $rohdatenEXC['N']; //Spalte N = Leistung = z.B. auch Urlaub, Krank
 // $rohdatenEXC['O']; //Spalte O = Stunden 
 
    if(!isset($auswertung[$rohdatenEXC['E']])) //Mitarbeiter
    {
        $auswertung[$rohdatenEXC['E']] = $rohdatenEXC; 
        switch($rohdatenEXC['N']){
          case ("Urlaub"):
            $auswertung['Urlaub'] += $rohdatenEXC['O'];
            break;
         case ("Krank"):
            $auswertung['Krank'] += $rohdatenEXC['O'];
            break;
        }
    }
    else
    {
        $auswertung[$rohdatenEXC['E']]['O'] += $rohdatenEXC['O'];
    }
}

//Tabelle ausgeben: 
 foreach($auswertung as $key => $value){
  echo "<tr>"; // Ausgabe nächste Zeile in Tabelle 
    echo "<td>" . $value ['E'] . "</td>"; //Mitarbeiter
    echo "<td>" . $value ['Urlaub'] / 60 . "</td>"; //Urlaub
    echo "<td>" . $value ['Krank'] / 60 . "</td>"; //Krank
    echo "<td>" . $value ['O'] / 60 . "</td>"; //Gesamtstunden
    echo "</tr>";
 }

Verschoben von Community Talk nach Coding & Technik am 22.05.2015 14:35 durch gn#36

Benutzeravatar
BNa
Valued Contributor
Beiträge: 3169
Registriert: 12.04.2010 23:51
Kontaktdaten:

Re: Exceldatei einlesen/auswerten und in neues Array schreib

Beitrag von BNa »

Also erstmal auf Homogenität achten, also (wenn konstruktiv(!) möglich) nur 'oder ".
Dann möglichst keine "geschriebenen" Variablen, wie 'Krank' sondern besser 'K' und 'U'.
Ferner weiß ich nicht, wo $auswertung gebildet wird.

Wenn $auswertung aber tatsächlich von irgendwo hergeholt wird und auch stets gefüllt ist (auch bei NULL value)
dann mal vor diesem Bereich

Code: Alles auswählen

//Tabelle ausgeben: 
 foreach($auswertung as $key => $value){
ein var_dump($auswertung);

einfügen. Hier werden dann alle keys und values ausgegeben ( warsch. ein verschacht. array() ).
Diese Ausgabe mal checken, a. ob alle keys/values gefüllt werden, b. ob überhaupt entsprechende Index'e existieren.

Falls Index'e nur teilweise existieren, weil "technisch" nicht befüllt, dann mit isset() im Ausgabe-Array arbeiten.

Kann auch sein, das schon die case() Abfrage syntaktisch falsch ist, dann wird es eh nicht funktionieren.

Eventuell auch mal so probieren

Code: Alles auswählen

    if(isset($auswertung[$rohdatenEXC['E']])) //Mitarbeiter 
statt

Code: Alles auswählen

    if(!isset($auswertung[$rohdatenEXC['E']])) //Mitarbeiter 
:wink:

Ansonsten kannst Du xls-Dateien auch einfach Inline im Forum anzeigen lassen,
http://www.4seven.de/forum/6test/viewto ... f=10&t=100

sofern es eine phpbb-Frage wäre und nicht nur eine reine php-Frage ist.
phpfrage
Mitglied
Beiträge: 4
Registriert: 20.05.2015 15:26

Verarbeitung von mehrdimensionalen Arrays

Beitrag von phpfrage »

Hallo, ich habe ein großes Problem bei der Verarbeitung von mehrdimensionalen Arrays und komme
leider einfach nicht weiter.

Die folgenden Rohdaten sollen ausgewertet werden:
Name | Stunden | Leistung
Lehmann | 120 | Urlaub
Lehmann | 90 | egal
Meier | 30 | Krank

Dabei sollen die Gesamtstunden der Mitarbeiter ermittelt werden, sowie
die Stunden bei Krank und bei Urlaub. Nach der Auswertung soll folgende
Tabelle ausgegeben werden:

Name | StdGes | StUrlaub | StdKrank
Lehmann | 210 | 120 | 0
Meier | 30 | 0 | 30

Das Array welches ausgewertet werden soll liegt in der folgenden Form vor:

array(3) { ["A"]=> string(7) "Lehmann" ["B"]=> float(120) ["C"]=> string(6) "Urlaub"
array(3) { ["A"]=> string(7) "Lehmann" ["B"]=> float(90) ["C"]=> string(4) "egal"
array(3) { ["A"]=> string(5) "Meier" ["B"]=> float(30) ["C"]=> string(5) "Krank"}

Mein Ansatz ist folgender, ich bilde jeweils ein Array $namen, $stunden, $leistung und
packe diese Arrays dann in das Array $auswertung. Das Array $leistung dient zur Prüfung
wie die Stunden summiert werden soll (Fall: Krank oder Urlaub).
Mein Code wäre folgender:

Code: Alles auswählen

$rohdatenEXC = array(); //gesamte Inhalt der Exceldatei als Array speichern
$name = array();
$stunden = array();
$leistung = array();

$Mitarbeiter = array();
$StdGes = array();
$StdUrl = array();
$StdKrk = array();
$auswertung = array($Mitarbeiter, $StdGes, $StdUrl, $StdKrk);

foreach($sheetData as $key => $rohdatenEXC){
  $name = $rohdatenEXC['A'];
  $stunden = $rohdatenEXC['B'];
  $leistung = $rohdatenEXC['C'];

  if(!isset($auswertung[$name])){ // Prüfen ob Mitarbeiter noch nicht im Array $auswertung vorhanden ist
        $auswertung[$Mitarbeiter] = $name; 
        $auswertung[$StdGes] = $auswertung[$StdGes] + $stunden; //Gesamtstunden
        If ($leistung == "Urlaub"){
          $auswertung[$StdUrl] = $auswertung[$StdUrl] + $stunden; //Stunden Urlaub
        }
        else{
          $auswertung[$StdUrl] = 0;
        }
        
        If ($leistung == "Krank"){
          $auswertung[$StdKrk] = $auswertung[$StdKrk] + $stunden; //Stunden Krank
        }
        else{
          $auswertung[$StdKrk] = 0;
        }
  }
  else { //Mitarbeiter ist bereits im Array $auswertung
     $auswertung[$StdGes] = $auswertung[$StdGes] + $stunden; //Gesamtstunden
     If ($leistung == "Urlaub"){
       $auswertung[$StdUrl] = $auswertung[$StdUrl] + $stunden; //Stunden Urlaub
     }
    else{
       $auswertung[$StdUrl] = 0;
    }
        
    If ($leistung == "Krank"){
       $auswertung[$StdKrk] = $auswertung[$StdKrk] + $stunden; //Stunden Krank
    }
    else{
       $auswertung[$StdKrk] = 0;
    }
  }
}

//Tabelle ausgeben:
 
 foreach($auswertung as $key => $value){
  echo "<tr>"; // Ausgabe nächste Zeile in Tabelle 
  echo "<td>" . $value [$Mitarbeiter] . "</td>"; //Mitarbeiter
  echo "<td>" . $value [$StdGes] / 60 . "</td>"; //Stunden gesamt
  echo "<td>" . $value [$StdUrl] / 60 . "</td>"; //Stunden Urlaub
  echo "<td>" . $value [$StdKrk] / 60 . "</td>"; //Stunden Krank
  echo "</tr>";
 }
Überall wo ich die Wertzuweisung bei den Arrays machen will kommt die Fehlermeldung:

Warning: Illegal offset type

Ich weiß das dies auf einen falschen Index hindeutet, habe auch schon anderen Sachen getestet:
z.B. $auswertung['Mitarbeiter'] = $name; klappt leider auch nicht...
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Verarbeitung von mehrdimensionalen Arrays

Beitrag von gn#36 »

Du hättest das ruhig in einem deiner beiden anderen Thema lassen können - das ist doch genau die gleiche Frage noch mal mit anderem Code. Ich führe das jetzt mal zusammen, da es sich um eine Weiterentwicklung handelt aber beim nächsten Mal setz' ein und dasselbe Thema bitte dort fort, wo du es begonnen hast. Das hilft Helfern zu wissen was du schon so ausprobiert hast und hilft ihnen vor allem auch deinen Kenntnisstand einzuschätzen.

Cross-Posts (mehrere Themen mit gleichem Inhalt vom gleichen User) sind bei uns nicht erwünscht, siehe auch KB:knigge.

Die Variablen $StdUrl, $StdGes und $StdKrk sind Arrays. Du kannst keine Arrays als Index eines anderen Arrays nutzen. Aber du kannst einfach deinen Einträgen in $auswertung Namen verpassen, mit denen du die benutzen kannst:

Code: Alles auswählen

$auswertung = array('Mitarbeiter' => array(), 'StdGes' => array(), 'StdUrl' => array(), 'StdKrk' => array());
Dann kannst du auf die Komponenten mit $auswertung['Mitarbeiter'] zugreifen. Aber Achtung: So wie du das im Moment machst wird das nicht funktionieren. Du willst einen Eintrag pro Mitarbeiter in jedem dieser Arrays, nicht nur einen Eintrag insgesamt.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „Coding & Technik“