SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

PHP 5.3 & MySQL 5.1

PHP 5.3 & MySQL 5.1 zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Grundlagen

PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 01.05.2013, 23:39:51
highway82 highway82 ist offline
Anfänger
 
Registriert seit: May 2013
Alter: 41
Beiträge: 3
2 dimensinales Array als Tabelle ausgeben

Hi zusammen,
bin neu hier in dem Forum und hoffe dass mir der eine oder andere weiterhelfen kann.

Zu meinem Problem:
Habe eine SQL Abfrage, die mir folgende Tabellen-Struktur ausgibt:
PHP-Code:
+---------------------+---------------------+----------------+-------------------+--------+ 
Startdatum          Enddatum            Plan           Funktion          Anzahl 
+---------------------+---------------------+----------------+-------------------+--------+ 
2013-05-18 13:00:00 2013-05-18 19:00:00 Sommerwachplan Wachleiter        2      
+---------------------+---------------------+----------------+-------------------+--------+ 
2013-05-18 13:00:00 2013-05-18 19:00:00 Sommerwachplan Bootsführer       1      
+---------------------+---------------------+----------------+-------------------+--------+ 
2013-05-18 13:00:00 2013-05-18 19:00:00 Sommerwachplan Einsatztaucher    2      
+---------------------+---------------------+----------------+-------------------+--------+ 
2013-05-18 13:00:00 2013-05-18 19:00:00 Sommerwachplan Rettungsschwimmer 5      
+---------------------+---------------------+----------------+-------------------+--------+ 
2013-05-18 13:00:00 2013-05-18 19:00:00 Sommerwachplan Praktikant        5      
+---------------------+---------------------+----------------+-------------------+--------+ 
//usw. 
Die Auswahl möchte ich in folgender Struktur ausgeben:
PHP-Code:
+------------+---------------+------------+-------------+----------------+-------------------+------------+ 
2013-05-18 13:00 19:00 Wachleiter Bootsführer Einsatztaucher Rettungsschwimmer Praktikant 
|            |               | 
Wachleiter |             | Einsatztaucher Rettungsschwimmer Praktikant 
|            |               |            |             |                | 
Rettungsschwimmer Praktikant 
|            |               |            |             |                | 
Rettungsschwimmer Praktikant 
|            |               |            |             |                | 
Rettungsschwimmer Praktikant 
+------------+---------------+------------+-------------+----------------+-------------------+------------+ 
//usw. 
Meine Überlegung war nun, dass ich per 2 dimensionalem Array durchführe, welches ich mir auch schon ausgeben kann.

CODE
PHP-Code:
$sql=
        SELECT 
            datetimes.datetime_start 
            ,datetimes.datetime_end 
            ,plans.plan_name 
            ,functions.name 
            ,functioncounts.count 
        FROM datetimes 
        LEFT JOIN planschedules ON datetimes.datetime_start = planschedules.datetimes_datetime_start 
        LEFT JOIN plans ON planschedules.plans_id = plans.id 
        LEFT JOIN functioncounts ON plans.id = functioncounts.plans_id 
        LEFT JOIN functions ON functioncounts.functions_id = functions.id 
        WHERE plans.unblock = 1 
        AND datetimes.datetime_start BETWEEN '2013-05-18' AND '2013-05-20' 
        ORDER BY datetimes.datetime_start, functioncounts.order 
    "

    
$query_sql mysql_query($sql) or die("Anfrage nicht erfolgreich"); 
     
    
$data = array(); 
     
    while(
$row mysql_fetch_assoc($query_sql)) { 

        
$startdate $row['datetime_start']; 
        
$enddate $row['datetime_end']; 
        
$planname $row['plan_name']; 
        
$functionname $row['name']; 
        
$funccount $row['count']; 
         
        
$data[$startdate][$functionname] = $row
    } 
Leider schaffe ich es nicht dies in eine Tabellenform zu bekommen.
Fehlermeldung:
PHP-Code:
Array 

    [
2013-05-18 13:00:00] => Array 
        ( 
            [
Wachleiter] => Array 
                ( 
                    [
datetime_start] => 2013-05-18 13:00:00 
                    
[datetime_end] => 2013-05-18 19:30:00 
                    
[plan_name] => Sommerwachdienst 
                    
[name] => Wachleiter 
                    
[count] => 
                


            [
Bootsfuehrer] => Array 
                ( 
                    [
datetime_start] => 2013-05-18 13:00:00 
                    
[datetime_end] => 2013-05-18 19:30:00 
                    
[plan_name] => Sommerwachdienst 
                    
[name] => Bootsfuehrer 
                    
[count] => 
                


            [
Einsatztaucher] => Array 
                ( 
                    [
datetime_start] => 2013-05-18 13:00:00 
                    
[datetime_end] => 2013-05-18 19:30:00 
                    
[plan_name] => Sommerwachdienst 
                    
[name] => Einsatztaucher 
                    
[count] => 
                


            [
Rettungsschwimmer] => Array 
                ( 
                    [
datetime_start] => 2013-05-18 13:00:00 
                    
[datetime_end] => 2013-05-18 19:30:00 
                    
[plan_name] => Sommerwachdienst 
                    
[name] => Rettungsschwimmer 
                    
[count] => 10 
                


            [
Praktikant] => Array 
                ( 
                    [
datetime_start] => 2013-05-18 13:00:00 
                    
[datetime_end] => 2013-05-18 19:30:00 
                    
[plan_name] => Sommerwachdienst 
                    
[name] => Praktikant 
                    
[count] => 10 
                


        )

Bei meinem Versuch der Ausgabe erhalte ich jedoch die Fehlermeldung "Notice: Array to string conversion in C:xampphtdocsworkingscheduleplantmpldefault.php on line 50
Array"

CODE:
PHP-Code:
echo "<table>"
    foreach(
$data as $rows => $row1){ 
        echo 
"<tr>"
        foreach(
$row1 as $col => $cell){ 
            echo 
"<td>"
            echo 
$cell
            echo 
"</td>"
        } 
        echo 
"</tr>"
    } 
echo 
"</table>"
Ergebnis:
Tabelle:
PHP-Code:
+----+----+----+----+----+ 
00 01 02 03 04 
+----+----+----+----+----+ 
10 11 12 13 14 
+----+----+----+----+----+ 

//Fehlermeldung pro Tabelle-Zelle (00 - 14): 
Notice: Array to string conversion in C:xampphtdocsworkingscheduleplantmpldefault.php on line 50 
Array     

==> 
//Zeile Fehlermeldung (line 50):  
echo $cell
Zu meinen Fragen:
1.) Würdet Ihr den Aufbau des Arrays ebenfalls so durchführen um die gewünschte Struktur zu erhalten?
2.) Was mach ich bei der Darstellung in Tab-Form falsch. (--> Thema str_repeat für die wiederholte Darstellung der Funktionen kenne ich schon. Mir geht es um den allgemeinen Aufbau.)

Auch wenn der Beitrag etwas länger ist, hoffe ich dass mir der eine oder andere helfen kann.
Vielen Dank schon im Voraus
Mit Zitat antworten
  #2  
Alt 02.05.2013, 20:00:23
Benutzerbild von urvater
urvater urvater ist offline
Senior Member
 
Registriert seit: Feb 2006
Ort: Wallrabenstein
Alter: 55
Beiträge: 1.044
AW: 2 dimensinales Array als Tabelle ausgeben

Geht sicher noch eleganter.
PHP-Code:
#wird im foreach benötigt um die Namen aufzuzählen
function zaehleArr($name){
    if(
is_array($name)){
        
$return '';
        
$strName $name['name'];
        
$counter $name['count'];
        
        for(
$i=0;$i<$counter;$i++){
            
$return.=$strName.'<br />';
        }
        return 
$return;
    }


#benutzt dein erzeugtes $data
echo '<table border="1">';
if(
is_array($data)){
    foreach(
$data as $key => $daten){
        
$TagZeit explode(' ',$key);
        echo 
'<tr>';
        echo 
'<td>'.$TagZeit[0] .'</td><td>'.$TagZeit[1].'</td>';
        echo 
'<td>'.zaehleArr($daten['Wachleiter']).'</td>';
        echo 
'<td>'.zaehleArr($daten['Bootsfuehrer']).'</td>';
        echo 
'<td>'.zaehleArr($daten['Einsatztaucher']).'</td>';
        echo 
'<td>'.zaehleArr($daten['Rettungsschwimmer']).'</td>';
        echo 
'<td>'.zaehleArr($daten['Praktikant']).'</td>';
        echo 
'</tr>';
    }
}
echo 
'<table>'
Mit Zitat antworten
  #3  
Alt 02.05.2013, 20:45:45
Benutzerbild von urvater
urvater urvater ist offline
Senior Member
 
Registriert seit: Feb 2006
Ort: Wallrabenstein
Alter: 55
Beiträge: 1.044
AW: 2 dimensinales Array als Tabelle ausgeben

Geht sicher noch eleganter.
PHP-Code:
#wird im foreach benötigt um die Namen aufzuzählen
function zaehleArr($name){
    if(
is_array($name)){
        
$return '';
        
$strName $name['name'];
        
$counter $name['count'];
        
        for(
$i=0;$i<$counter;$i++){
            
$return.=$strName.'<br />';
        }
        return 
$return;
    }


#benutzt dein erzeugtes $data
echo '<table border="1">';
if(
is_array($data)){
    foreach(
$data as $key => $daten){
        
$TagZeit explode(' ',$key);
        echo 
'<tr>';
        echo 
'<td>'.$TagZeit[0] .'</td><td>'.$TagZeit[1].'</td>';
        echo 
'<td>'.zaehleArr($daten['Wachleiter']).'</td>';
        echo 
'<td>'.zaehleArr($daten['Bootsfuehrer']).'</td>';
        echo 
'<td>'.zaehleArr($daten['Einsatztaucher']).'</td>';
        echo 
'<td>'.zaehleArr($daten['Rettungsschwimmer']).'</td>';
        echo 
'<td>'.zaehleArr($daten['Praktikant']).'</td>';
        echo 
'</tr>';
    }
}
echo 
'<table>'
Mit Zitat antworten
  #4  
Alt 02.05.2013, 21:14:02
highway82 highway82 ist offline
Anfänger
 
Registriert seit: May 2013
Alter: 41
Beiträge: 3
AW: 2 dimensinales Array als Tabelle ausgeben

Hallo Urvater,

vielen Dank für deine Antwort, deine Antwort, sieht schon einmal gut aus. Leider nicht ganz was ich suche.
Leider habe ich mal wieder den größten Fehler selber gemacht, in dem ich gedacht habe andere Leute kapieren eh was ich möchte. Dafür SORRY.

Kurz zur Erklärung: Es soll später mal ein Arbeitsplan sein, in dem sich freiwillige Mitglieder einer Rettungsorg. eintragen können, wann sie arbeiten wollen.

Folgende Darstellung trifft es besser:
PHP-Code:
+------------+---------------+------------+-------------+----------------+-------------------+------------+  
2013-05-18 13:00 19:00 Wachleiter Bootsführer Einsatztaucher Rettungsschwimmer Praktikant |
+            +               +------------+-------------+----------------+-------------------+------------+  
|            |               | 
Testuser1  | ---         | ---            | Testuser2         | ---        |  
|            |               | ---        |             | ---            | ---               | ---        |  
|            |               |            |             |                | ---               | ---        |  
|            |               |            |             |                | ---               | ---        |  
|            |               |            |             |                | ---               | ---        |  
+------------+---------------+------------+-------------+----------------+-------------------+------------+ 
Über das SQL in #1 frage ich folgende Informationen ab:
* Startzeit (Format: DATETIME
* Endzeit (Format: DATETIME) => wird nur benötigt wenn nicht 0000-00-00 00:00:00 ist
* Planname (VARCHAR)
* Funktion (VARCHAR) => Es können unterschiedliche Funktionen sein.
* Anzahl (INT) => Kann unterschiedlich sein.

Meine Überlegung war nun ein 2. dimensinales Array zu erzeugen um die Darstellung umzusetzen.
Da ich einzelnen Namenseinträge + --- über eine anderen Funktion auslese und erstelle, wollte ich erst mal einfach entsprechend der jeweiligen Anzahl den Funktionsname ausgeben lassen (Tabelle #1) --> diese wird später duch --- oder <Name> ersetzt.
Leider weis ich nicht wie viele und welche Funktionen pro Plan eingetragen sind.

Kannst du mir hier weiterhelfen.

Vielen Dank und nochmals Sorry weil ich mich falsch ausgedrückt habe.
Sollten weitere Infos fehlen bitte melden.

Geändert von highway82 (02.05.2013 um 21:41:11 Uhr)
Mit Zitat antworten
  #5  
Alt 03.05.2013, 12:24:24
Benutzerbild von urvater
urvater urvater ist offline
Senior Member
 
Registriert seit: Feb 2006
Ort: Wallrabenstein
Alter: 55
Beiträge: 1.044
Ich weiß nicht in welcher Form, wie und zu welchem Zeitpunkt dir die Daten der einzelnen Personen zur Verfügung stehen. Zumindest sollte dir dies den richtigen Denkanstoß geben.
PHP-Code:
$funktion = array();
echo 
'<table border="1">';
if(
is_array($data)){
    foreach(
$data as $key => $daten){
        
$TagZeit explode(' ',$key);
        echo 
'<tr>';
        echo 
'<td>'.$TagZeit[0] .'</td><td>'.$TagZeit[1].'</td>';
        while(
$arr array_shift($daten)){
            
$funktion[$arr['name']] = $arr['count'];
            echo 
'<td>'.$arr['name'].'</td>';
        }
        echo 
'</tr>';
    }
    
}
echo 
'<table>';
var_dump($funktion); 
Irgend wie gefällt mir dein momentaner Ansatz für dem Plan nicht.
Ich gehe einmal davon aus, dass es zumindest als Funktion immer einen Wachleiter | Bootsführer | Einsatztaucher | Rettungsschwimmer | Praktikant geben wird. Somit könnte man die Tabellenüberschrift als fest eingestellt betrachten. Allerdings können einige Funktionen nicht besetzt sein.
Ich vermute einmal, dass das momentane Skript dir die Tabelle zerhaut, wenn zum Beispiel mal kein Taucher oder sonstige Position besetzt ist.
Mit Zitat antworten
  #6  
Alt 03.05.2013, 19:24:26
Benutzerbild von urvater
urvater urvater ist offline
Senior Member
 
Registriert seit: Feb 2006
Ort: Wallrabenstein
Alter: 55
Beiträge: 1.044
AW: 2 dimensinales Array als Tabelle ausgeben

So da mir das alles momentan nicht gefallen hat, habe ich mir mal ein paar Gedanken gemacht.
Dazu hab ich mir folgende Tabellen erstellt:
Code:
CREATE TABLE IF NOT EXISTS `epl_einsatzplan` (
  `tag` date NOT NULL,
  `schicht_id` int(10) unsigned NOT NULL,
  `funktion_id` int(10) unsigned NOT NULL,
  `person_id` int(100) unsigned NOT NULL,
  KEY `tag` (`tag`,`schicht_id`,`funktion_id`,`person_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `epl_einsatzkraefte` (
  `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Vorname` varchar(20) CHARACTER SET utf8 NOT NULL,
  `Nachname` varchar(30) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `epl_funktionen` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Bezeichnung` varchar(40) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`),
  KEY `Bezeichnung` (`Bezeichnung`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `epl_schichtzeiten` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Bezeichnung` varchar(10) CHARACTER SET utf8 NOT NULL COMMENT 'Kürzel der Schicht',
  `Beschreibung` varchar(20) CHARACTER SET utf8 NOT NULL COMMENT 'genauer Schichtname',
  `Beginn` time NOT NULL,
  `Ende` time NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `Bezeichnung` (`Bezeichnung`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
Befüllt man nun die Tabellen entsprechend den gewünschten werten kann man sich dazu auch eine schöne Ausgabe basteln.
So auf die schnelle hab ich mir da mal sowas ausgedacht. Geht sicher schicker und vereinfachen kann man es sicher auch aber ist mir vorerst wurscht.
PHP-Code:
<?php
$sql 
= new mysqli('localhost','root','','test');
if(
$sql){
    echo 
'DB-Verbindung hergestellt';
}
#Array mit den möglichen Funktionen, welche eine Person haben kann
$funkArr = array();

#array mit den Daten zu jeder möglichen Schichtart
$schichten = array();

#wird mit den Daten für die Anzeige des Schichtplans befüllt
$schichtplan = array();

#zerlegt das Array mit allen eingetragenen Persone zu einer bestimmten Funktion
function zerlegePersonenArray($array){
    
$return '<td>&nbsp;</td>';
    if(!empty(
$array)){
        
$return '<td>';
        foreach(
$array as $wert){
            
$return .= $wert.'<br />';
        }
        
$return .= '</td>';
    }
    return 
$return;
}

#alle Funktionen aus der DB-Tabelle holen und array befüllen
$funktRes $sql->query('SELECT * FROM epl_funktionen');
while(
$row $funktRes->fetch_object()){
    
    
$funkArr[$row->id]=$row->Bezeichnung;
}

#alle Schichtarten aus der DB-Tabelle holen und array befüllen
$schichtRes $sql->query('SELECT * FROM epl_schichtzeiten');
while(
$row $schichtRes->fetch_object()){
    
$schichten[] = $row;
}

#Daten aus der Schichtplantabelle holen und array befüllen
$einsKraftRes $sql->query("SELECT
                                s.*,k.Nachname
                                FROM epl_einsatzplan s
                                RIGHT JOIN epl_einsatzkraefte k
                                ON k.Id = s.person_id
                                WHERE tag BETWEEN '2013-05-02' AND '2013-05-04'
                                ORDER BY tag,schicht_id"
);
if(
$einsKraftRes){
    while(
$row $einsKraftRes->fetch_object()){
        if(!
array_key_exists((string)$row->tag,$schichtplan)){
            
$schichtplan[(string)$row->tag] = array();
        }

        if(!
array_key_exists($row->schicht_id,$schichtplan[$row->tag])){
            
$schichtplan[$row->tag][$row->schicht_id] = array();
            
$schichtplan[$row->tag][$row->schicht_id]['anzeige'] =  $schichten[$row->schicht_id-1]->Beschreibung.' '.$schichten[$row->schicht_id-1]->Beginn.'-'.$schichten[$row->schicht_id-1]->Ende;
            
$schichtplan[$row->tag][$row->schicht_id][funktion] = array_fill(1,count($funkArr),array());
            
$schichtplan[$row->tag][$row->schicht_id][funktion][$row->funktion_id] = array();
        }
        
$schichtplan[$row->tag][$row->schicht_id][funktion][(int)$row->funktion_id][(int)$row->person_id] = $row->Nachname;
    }
    
}

#Beginn der Ausgabe
echo '<table>'."\r";
echo 
'<tr><th>Tag</th><th>Schicht</th>';
    for(
$i=1;$i<=count($funkArr);$i++){
        echo 
'<th>'.$funkArr[$i].'</th>';
    }
    echo 
'</tr>'."\r";
    foreach(
$schichtplan as $key => $val){
        echo 
'<tr><td rowspan="'.count($val).'">'.$key.'</td>';
        
$i 1;
        while(
$i<count($val)+1){
            if(
$i==1){
                echo 
'<td>'.$val[$i]['anzeige'].'</td>';
                for(
$y=1;$y<count($val[$i]['funktion'])+1;$y++){
                    echo 
zerlegePersonenArray($val[$i]['funktion'][$y]);
                }
                echo 
'</tr>'."\r";
            } else {
                echo 
'<tr><td>'.$val[$i]['anzeige'].'</td>';
                for(
$y=1;$y<count($val[$i]['funktion'])+1;$y++){
                    echo 
zerlegePersonenArray($val[$i]['funktion'][$y]);
                }
                echo 
'</tr>'."\r";
            }
            
$i++;
        }
    }
echo 
'</table>';
Das '."\r"' kann man entfernen. Hab es nur eingebaut, damit ich mir den erzeugten HTML-Code besser ansehen kann.

Geändert von urvater (03.05.2013 um 19:35:44 Uhr) Grund: überflüssige Testvariablen entfernt
Mit Zitat antworten
  #7  
Alt 03.05.2013, 21:08:37
highway82 highway82 ist offline
Anfänger
 
Registriert seit: May 2013
Alter: 41
Beiträge: 3
AW: 2 dimensinales Array als Tabelle ausgeben

Hallo Urvater,

vielen vielen Dank. Jetzt habe ich ein richtig schlechtes Gewissen. Wollte ja nicht gleich dass ich eine fast fertige Lösung erhalte, sondern nur ein paar Denkanstöße.

So ähnlich habe ich mir das auch vorgestellt.
Die DB hatte ich von der Struktur her fast wie du sie dir erstellt hast. Somit musste ich hier nur ein paar Punkte anpassen.

Nochmals vielen Dank.

Thema kann vorerst geschlossen werden. Sobald ich meine Lösung habe, werde ich sie hier veröffentlichen.
Mit Zitat antworten
Antwort

Stichworte
2 dimensionales array, array assoziativ, tabelle erzeugen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
vergleichen und bei Bedarf Array erweitern Tikiwiki PHP Grundlagen 4 12.11.2012 14:08:07
Arrayblind tlang78 PHP Grundlagen 2 30.06.2009 16:08:33
Array formatiert ausgeben Faang PHP Grundlagen 3 15.08.2008 02:47:43
Doppelte einträge aus einem Mehrdimensionalen Array aussortieren und löschen PHoenix_KM PHP für Fortgeschrittene und Experten 2 17.04.2008 19:19:53
Einzelne Daten aus Textdatei Auslesen azubinator PHP Grundlagen 153 17.12.2004 14:36:58


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:36:21 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt