Suche in einem Array erstellt mit fetch_array()

Mike Rofon

Erfahrenes Mitglied
Nach einer DB-Abfrage mache ich
PHP:
while ( $step = $res->fetch_array() )
also ist es doch so, daß ich ein großes Array $step habe mit "Zeilen" aus der Datenbank-Tabelle, auch jeweils als Array. Richtig soweit?

Jetzt muß ich bei jedem Durchlauf der WHILE Schleife wissen ob es in IRGENDEINEM $step im Feld $step["tid"] den Wert x gibt und ob dann dieser Step in $step["fertig"] ein gültiges Datum enthält.

Hintergrund: Ein Arbeitsschritt eines Projekts kann möglicherweise nur dann ausgeführt werden, wenn andere Arbeitsschritte vorher fertiggestellt sind. Deswegen soll er andersfarbig dargestellt werden und auch keinen Link bzw. Button bekommen um ihn zu beenden.
Die Liste von Arbeitsschritten, die vorher fertig sein müssen liegt quasi in Form einer Zeichenkette wie zB. "1,4,5,7,12,14,22" vor, die kann ich ja mit einem explode() schnell selbst in ein Array verwandeln.

natürlich kann es auch sein, daß in einem Projekt nur einige Arbeitsschritte vorkommen, von denen der mit der Zeichenkette "1,4,5,7,12,14,22" abhängig ist, also zB in einem Projekt kommen nur die Schritte 1, 5, und 14 vor, aber trotzdem müssen die erst fertig sein bevor der Schritt mit den Abhängigkeiten "aktiviert" wird.

Ich habe absolut KEINE Idee, wie man diese Suche auf die Beine stellt.
Also: Suche in allen Steps nach einer Nummer "1" im Feld tid und wenn Du die findest schau nach ob im Feld fertig ein Datum steht. Danach suche in allen Steps im Feld tid nach einer 4 usw....
Und wenn auch nur EIN Step gefunden wird der noch nicht fertig ist, dann setze mir ein Flag "blockieren" auf 1
Ob dann die Suche sofort abgebrochen werden soll is fast wurscht.

Konnte mir irgendjemand bis hierhin folgen? ;)
Macht es vielleicht wirklich Sinn, so eine Suche in der Datenbank zu machen wo ich das fetch_array() her habe? Das wollte ich vermeiden weil ich dachte in einem Array suchen geht schneller.

Im Voraus dankbare Grüße
Mike
 
Hi

Macht es vielleicht wirklich Sinn, so eine Suche in der Datenbank zu machen wo ich das fetch_array() her habe?
pauschal ohne Zeitmessung kann man das zwar nicht sagen, aber ja, kann schneller sein.

Für den Fall wäre eine Beschreibung deiner Tabellenstruktur nötig, um zu helfen...

Wenn es doch in PHP sein soll: In der vorhandenen DB-Zeilen-Schleife mit in_array() (oder mit noch einer Schleife) prüfen, ob der aktuelle id-Wert im anderen Array ist.
 
Hi
Für den Fall wäre eine Beschreibung deiner Tabellenstruktur nötig, um zu helfen...

Wenn es doch in PHP sein soll: In der vorhandenen DB-Zeilen-Schleife mit in_array() (oder mit noch einer Schleife) prüfen, ob der aktuelle id-Wert im anderen Array ist.
SQL:
--
-- Tabellenstruktur für Tabelle `brps_psteps`
--

CREATE TABLE IF NOT EXISTS `brps_psteps` (
  `ids` int(11) NOT NULL AUTO_INCREMENT,
  `pid` int(11) NOT NULL,
  `tid` int(11) NOT NULL,
  `stepname` varchar(40) NOT NULL,
  `stepkurz` text NOT NULL,
  `steplang` text NOT NULL,
  `abhaengig` varchar(30) NOT NULL,
  `start` datetime NOT NULL,
  `fertig` datetime NOT NULL,
  `abfrage` varchar(50) NOT NULL,
  `ergebnis` varchar(100) NOT NULL,
  `techniker` varchar(40) NOT NULL,
  `bemerkung` text NOT NULL,
  PRIMARY KEY (`ids`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;
wobei an "abhaengig" die kommaseparierte Liste ala 1,2,4,7,12 ... drin steht und diese einzelnen Arbeitsschritte im Feld tid zu finden sind. pid ist die Projekt-ID, ids eine laufende Nummer, die brauch ich aber auch noch :)

Ich mach hier ein SELECT * WHERE pid = Projekt-ID
und danach ein while ( $step = $res->fetch_array() ) { ... } und in dieser Schleife nehme ich die Liste aus dem Feld abhaengig und will jetzt im gesamten Array $step nach welchen suchen, wo die tid übereinstimmt UND ob das Feld fertig ein gültiges Datum hat.
Und erst wenn ALLE Einträge aus abhaengig ein gültiges Fertig-Datum haben, DANN kann dieser eine Arbeitsschritt freigegeben werden, ansonsten soll er ausgegraut werden und keine Buttons bekommen.
 
Zuletzt bearbeitet:
Wenn ich alles richtig verstanden habe, müsste dieses es tun:
Code:
$necessarysteps = [1,4,5,7,12,14,22];
$steps = [
["tid" => 1, "datum" => TRUE],
["tid" => 2, "datum" => FALSE],
["tid" => 3, "datum" => FALSE],
["tid" => 4, "datum" => TRUE],
["tid" => 5, "datum" => TRUE],
];
$complete = TRUE;
foreach ($steps as $step) {
if (in_array($step["tid"], $necessarysteps) && !$step["datum"]) $complete = FALSE;
}
var_dump($complete);
Das mit dem Datum musst Du noch ausformulieren.
 
das funktioniert irgendwie doch nicht... das Array $step entsteht ja bei
PHP:
while ($step = $res->fetch_array() )
weil ich ja alle Arbeitsschritte auflisten will.
Wenn ich jetzt innerhalb dieses While nochmal
PHP:
foreach ( $step as $s2 ) {
                            echo "<br/>" . $s2["tid"] . "#" . $s2["stepname"];
                         
                            }
mache, kommt beim ersten Arbeitsschritt mit einer "Abhängigkeit" nur folgendes raus:
Code:
5#5
5#5
2#2
2#2
3#3
3#3
O#O
O#O
S#S
S#S
U#U
U#U
1#1
1#1
0#0
0#0
0#0
0#0
Z#Z
Z#Z
#
#
#
#
#
#
Das ist immer jeweils das erste Zeichen des jeweiligen Feldes... der Datensatz sieht in etwa so aus:
SQL:
(5, 2, 3, 'Owncloud-Zugang einrichten', 'S***** Owncloudserver', 'URL: https://', '1', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'Zugangsdaten:', '', '', ''),

Mit einer MySQL Abfrage funktioniert alles wie gewünscht. Vielleicht sollte ich es dabei belassen...
 
Bin nicht so der DB-Experte; offenbar hatte ich da etwas falsch verstanden. Du solltest meinen Algorithmus in die while-Schleife für das Lesen der Datensätze integrieren können:
Code:
$necessarysteps = [1,4,5,7,12,14,22];
$complete = TRUE;
while ($step = $res->fetch_array() ) {
    if (in_array($step["tid"], $necessarysteps) && !$step["datum"]) $complete = FALSE;
}
var_dump($complete);
Dies ungetest, da ich die Datenbank nicht habe.
Allerdings liegt das Ergebnis erst dann vor, wenn alle Schritte abgearbeitet wurden.
Wenn Du eine Lösung mit SQL hast, dann poste sie doch Mal, damit andere davon profitieren und ich etwas lernen kann.
 
ich glaub Du siehst die ganze Aufgabe noch nicht....
Beispiel: Der Arbeitsschritt heißt Probesendung. DIE kann aber erst erfolgen, wenn vorher mehrere andere Punkte erledigt sind.:
- FTP-Zugang einrichten
- Senderechner einrichten
- Audiokonfiguration einstellen
- Mikrofon einstellen
- Soundcheck
- OnAirDesign bereitstellen
- Coaching

So. Wenn ich jetzt in den Projekt-Details die Arbeitsschritte alle aufliste, dann stehen die alle untereinander, aber wenn zB der Soundcheck noch nicht fertig ist, bleibt der Schritt "Probesendung" nicht anklickbar.
Im übrigen kann es auch sein, daß ein Projekt darin besteht daß ein Moderator ein neues Mikrofon hat und daher vor der Probesendung NUR der Mikrofon-Check und der Soundcheck gemacht werden muß.
So. In der While-Schleife werden nun alle Steps des Projektes in Tabellenzeilen gelegt, WOBEI zwischendrin beim Arbeitsschritt "Probesendung" geprüft werden muß, ob ALLE Arbeitsschritte des jeweiligen Projektes, die vorher erledigt sein müssten, auch fertig sind. Also muß das gesamte Set an Arbeitsschritten nochmal durchsucht werden, also ne Schleife innerhalb der Schleife.und zwar für jede einzelne Tabellenzeile (oberes While)
Außerdem wäre zu beachten daß zB. der Step "OnAirDesign bereitstellen" auch wieder abhängig ist davon, ob der Arbeitsschritt "FTP-Zugang bereitstellen" vorher fertig ist. Also falls es des Step "FTP-Zugang einrichten" im betreffenden Projekt auch gibt. Das muß ja nicht immer so sein.

Die SQL-Lösung funktioniert in groben Zügen so:
PHP:
$sql = "SELECT * FROM ".$dbprefix."psteps WHERE pid = '".$getvar["id"]."'";
$res = $db->query($sql);
        echo "<table width=\"95%\">\n";
        while ( $step = $res->fetch_array() ) {
            // untersuchen ob der Task von anderen Tasks innerhalb DIESES Projekts abhängig ist
            $blockiert = 0;
            if ($step["abhaengig"]) {
                // Abhängigkeiten vorhanden
                $stepliste = explode("," , $step["abhaengig"]);
                foreach ($stepliste as $s) {
                    $res2 = $db->query("SELECT * FROM ".$dbprefix."psteps WHERE (pid = '".$getvar["id"]."') AND (tid = '".$s."') AND (fertig = '0000-00-00 00:00:00' ) ");
                    if ($res2->num_rows) $blockiert++;
                    }
                }
                 
            if  ($blockiert) {
                $txtcol = "#888";
                $form_show_button = "";
                } else {
                $txtcol = "#000";
                $form_show_button = "<img class=\"aufzu\" src=\"erweitern.png\" alt=\"aufklappen und bearbeiten\" />";
                }
            if ($step["fertig"] != "0000-00-00 00:00:00") $form_show_button = "<img alt=\"erledigt\" src=\"ok.png\">";

            $form_id = "form".$step["ids"];
            echo "<tr class=\"tabletr\" style=\"color:".$txtcol.";\">
                    <td>".$step["stepname"]."</td><td>".$step["stepkurz"]."</td><td>".$form_show_button ."</td>
                </tr>\n";
            $ergebnisfrage = (!$step["abfrage"]) ? "" : "<form><small>".$step["abfrage"]."</small><br/><input type=\"text\" name=\"ergebnis\" maxlength=100 /></td><td><small>Bemerkung</small><br/><textarea name=\"bemerkung\" rows=3 cols=35 ></textarea></form>";
            echo "<tr class=\"tabletr\" id=\"".$form_id."\" style=\"display:none;\">
                    <td valign=top>".$ergebnisfrage."</td>
                   </tr>\n";
                 
        }
        echo "</table>";
$getvar["id"] kommt aus der aufrufenden URL und enthält die Projekt-ID (auto-increment)
 
Zuletzt bearbeitet:
Zurück