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
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden |
01.05.2013, 23:39:51
|
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] => 2
)
[Bootsfuehrer] => Array
(
[datetime_start] => 2013-05-18 13:00:00
[datetime_end] => 2013-05-18 19:30:00
[plan_name] => Sommerwachdienst
[name] => Bootsfuehrer
[count] => 1
)
[Einsatztaucher] => Array
(
[datetime_start] => 2013-05-18 13:00:00
[datetime_end] => 2013-05-18 19:30:00
[plan_name] => Sommerwachdienst
[name] => Einsatztaucher
[count] => 2
)
[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
|
02.05.2013, 20:00:23
|
|
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>';
|
02.05.2013, 20:45:45
|
|
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>';
|
02.05.2013, 21:14:02
|
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)
|
03.05.2013, 12:24:24
|
|
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.
|
03.05.2013, 19:24:26
|
|
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> </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
|
03.05.2013, 21:08:37
|
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.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 16:20:51 Uhr.
|