PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   vergleichen und bei Bedarf Array erweitern (http://www.selfphp.de/forum/showthread.php?t=24770)

Tikiwiki 08.11.2012 15:47:15

vergleichen und bei Bedarf Array erweitern
 
Hallo zusammen,

ich stehe wieder für mich unlösbaren Problem wobei ich Eure geschätzte Hilfe benötige.

Ich habe 2 Arrays (s. unten) die ich miteinander vergleichen möchte. Das 1. Array beinhaltet alle verfügbaren Sensoren die im 2. Array vorkommen sollten (im Bestfall).
Wenn z. B. im 2. Array der Sensor "S01-01" fehlt, soll das 2. Array um diesen fehlenden Sensor erweitert werden. Das erweitere Element muss das gleiche Datum wie die anderen haben.

Vielleicht habt Ihr für mich einen Lösungsweg wie ich diese beiden Arrays durchlaufen könnte und zum gewünschten Ergebnis komme. Eine Struktur wäre für mich schon ausreichend.

Aufbau 1. Array:
PHP-Code:

Array
(
    [
1] => Array
        (
            [
sensorid] => 1
            
[suchstring] => AI-00
        
)

    [
2] => Array
        (
            [
sensorid] => 2
            
[suchstring] => AI-01
        
)

    [
3] => Array
        (
            [
sensorid] => 5
            
[suchstring] => AI-02
        
)

    [
4] => Array
        (
            [
sensorid] => 6
            
[suchstring] => AI-03
        
)

    [
5] => Array
        (
            [
sensorid] => 12
            
[suchstring] => RSSI
        
)

    [
6] => Array
        (
            [
sensorid] => 9
            
[suchstring] => S01-00
        
)

    [
7] => Array
        (
            [
sensorid] => 10
            
[suchstring] => S01-01
        
)

    [
8] => Array
        (
            [
sensorid] => 11
            
[suchstring] => S01-02
        
)

    [
9] => Array
        (
            [
sensorid] => 13
            
[suchstring] => S01-03
        
)


2. Array
PHP-Code:

Array
(
    [
0] => Array
        (
            [
0] => 00:03:44 2012/10/21
            
[1] => AI-00
            
[2] => Double
            
[3] => 4-20mA
            
[4] => 0
            
[5] => 00
            
[6] => 7.385

        
)

    [
1] => Array
        (
            [
0] => 00:03:44 2012/10/21
            
[1] => AI-01
            
[2] => Double
            
[3] => 4-20mA
            
[4] => 0
            
[5] => 01
            
[6] => 8.082

        
)

    [
2] => Array
        (
            [
0] => 00:03:44 2012/10/21
            
[1] => AI-02
            
[2] => Double
            
[3] => 4-20mA
            
[4] => 0
            
[5] => 02
            
[6] => 455.695

        
)

    [
3] => Array
        (
            [
0] => 00:03:44 2012/10/21
            
[1] => AI-03
            
[2] => Double
            
[3] => 4-20mA
            
[4] => 0
            
[5] => 03
            
[6] => 7.969

        
)

    [
4] => Array
        (
            [
0] => 00:03:44 2012/10/21
            
[1] => RSSI
            
[2] => unsigned 32bit
            
[3] => 0~31
            
[4] => 0
            
[5] => 10
            
[6] => 20

        
)


    [
5] => Array
        (
            [
0] => 00:03:44 2012/10/21
            
[1] => S01-01
            
[2] => Double
            
[3] => 4-20mA
            
[4] => 1
            
[5] => 01
            
[6] => 3.063

        
)

    [
6] => Array
        (
            [
0] => 00:03:44 2012/10/21
            
[1] => S01-02
            
[2] => Double
            
[3] => 4-20mA
            
[4] => 1
            
[5] => 02
            
[6] => 3.298

        
)

    [
7] => Array
        (
            [
0] => 00:03:44 2012/10/21
            
[1] => S01-03
            
[2] => Double
            
[3] => 4-20mA
            
[4] => 1
            
[5] => 03
            
[6] => 11.990

        
)

// Hier beginnt das nächste Messintervall usw.

    
[8] => Array
        (
            [
0] => 00:03:44 2012/10/21
            
[1] => AI-00
            
[2] => Double
            
[3] => 4-20mA
            
[4] => 0
            
[5] => 00
            
[6] => 7.385

        
)


Besten Dank
LG
Dietmar

meikel (†) 08.11.2012 16:45:55

AW: vergleichen und bei Bedarf Array erweitern
 
Zitat:

Zitat von Tikiwiki (Beitrag 143938)
Ich habe 2 Arrays (s. unten) die ich miteinander vergleichen möchte. Das 1. Array beinhaltet alle verfügbaren Sensoren die im 2. Array vorkommen sollten (im Bestfall).
Wenn z. B. im 2. Array der Sensor "S01-01" fehlt, soll das 2. Array um diesen fehlenden Sensor erweitert werden. Das erweitere Element muss das gleiche Datum wie die anderen haben.

Gegenfrage: woher stammen die Arrays? CSV oder Datenbank?

Tikiwiki 08.11.2012 20:28:15

AW: vergleichen und bei Bedarf Array erweitern
 
Hallo meikel,

Danke für die Antwort. Ist eine durchaus sinnvolle Gegenfrage.
1. Array kommt von der Datenbank
2. Array von einer csv-Datei

Was mir noch aufgefallen ist. Passiert durch copy/paste. Beim zweiten Array nach dem
Vermerk "// Hier beginnt das nächste Messintervall usw.

Beim Datum sollte : 00:33:44 2012/10/21 stehen. Sonst wäre es ja kein neues Messinterval.

Danke
Dietmar

meikel (†) 10.11.2012 09:57:27

AW: vergleichen und bei Bedarf Array erweitern
 
Ich verstehe immer noch nicht den Sinn dessen, für den Du einen Algorithmus suchst.
Zitat:

Zitat von Tikiwiki (Beitrag 143941)
1. Array kommt von der Datenbank

Beinhaltet diese Tabelle ausschließlich nur die Namen der Sensoren, die Meßergebnisse liefern sollten?
Ungünstig bei den Bezeichnern ist, daß sie mathematische Symbole enthalten. Ein Ersatz des - (Minus) durch _ (Unterstrich) wäre angeraten.
Zitat:

2. Array von einer csv-Datei
Beinhaltet das CSV File ausschließlich nur ein Meßintervall (optimal) oder werden da kummulativ alle Neuigkeiten angehängt (suboptimal)?
Falls nur ein Meßintervall und keine Speicherung der Ergebnisse in der DB:
erstelle ein assoziatives Array aus der Abfrage nach folgendem Schema:
PHP-Code:

$array = array($SENSOR_NAME => null); 

In der fgetcsv Schleife verwendest Du den Sensornamen als Schlüssel und fügst die Parameter als Subarray ein:
$result_messintervall[$SENSOR_NAME] = array(...);
Um nicht gesetzte Sensoren zu ermitteln, prüfst Du in einer Schleife
PHP-Code:

foreach($result_messintervall AS $sensor_name => $wert){
  if (
is_null($wert))
    
alarm($sensorname);


Falls die Meßergebnisse in einer DB landen:
verwende eine Vorbelegung, bei der ein Wert auf NULL oder FALSE gesetzt wird.
Und danach suchst Du in Abhängigkeit vom Meßintervall.

Tikiwiki 12.11.2012 13:08:07

AW: vergleichen und bei Bedarf Array erweitern
 
Hallo meikel,

danke nochmals, dass Du Dich meines Problems annimmst. Ich möchte mich aber auch entschuldigen, für die anscheinend lückenhaften Informationen.
Da Dein letzter Beitrag für mich mittlerweile wie ein spanischen Dorf klingt (liegt nicht an Dir), da ich mich gedanklich an die Sensoren, Arrays und foreach-Schleifen verstricke. Darum kann ich nicht mehr beurteilen, ob Dein Vorschlag schon die Lösung wäre. Ich möchte da meine Erklärungen meines Problems erweitern, da ich nicht möchte, Deine Zeit unnötig in Anspruch zu nehmen und Du nur von Vermutung ausgehst.

So und jetzt gehts los:
1. Sinn dieser Fragestellung ist eine Tabelle die die Zeitintervalle, Sensoren, Messwerte übersichtlich darstellt. Eigentlich nichts anderes als eine Art Sitzplatzreservierung.
Es gibt Reihen (sprich das wären die einzelnen Messintervalle) und es gibt Spalten (sprich dies wären die einzelnen Sensoren) und die einzelnen Sitzplätze wären dann die Messwerte.

Die Daten stehen in einer Datenbank mit folgenden Aufbau:
Tabelle "Sensoren" -> sensorid, sensorname, f_messeinheit, etc.
Tabelle "Messwert" -> zeitstempel, f_sensorid, messwert

2. Die CSV-Datei wird tageweise geschickt und hat ca. 1000-2000 Zeilen). Es kommen in die Datenbank nur Werte die auch in der CSV-Datei vorliegen.

Jetzt hätte ich einen anderen Weg eingeschlagen um die Array-Problematik aussen vor zu lassen. Über die SELECT-Abfrage. Das wäre natürlich optimal.

Momentan verwende ich folgende Abfrage (diese liefert alle DS in bestimmten Zeitraum ohne Berücksichtigung, dass ein Sensor zum jeweiligen Zeitstempel fehlt

PHP-Code:

SELECT zeitstempelsensor.langbezeichnungsensor.sensornamesensor.sensoridsensor.messsignalmesswertidmesswertmessbereich_minmessbereich_maxeinheit
FROM messwert
JOIN sensor ON sensorid 
f_sensorid
WHERE 
(zeitstempel BETWEEN '$startdatum' AND '$enddatum')
AND 
f_messeinheitid '1'
ORDER BY zeitstempelsensorid ASC 

Jetzt wäre es eine tolle Sache das er als Ergebnis zusätzlich auch die NULL-Werte ausgeben könnte. Sprich zum Zeitstempel und Sensor = messwert-->NULL

Sollte dann in etwa so aussehen (gekürzt und vereinfacht).
2012-10-20 15:34:20 | Sensor1 | 1 | 7.38
2012-10-20 15:34:20 | Sensor2 | 2 | 13.79
2012-10-20 15:34:20 | Sensor3 | 5 | NULL
2012-10-20 15:34:20 | Sensor4 | 6 | 130.56
usw.

Anmerkung: Der Sensor3 gibt es zwar in der Tabelle "Sensor" aber kein Eintrag in Tabelle "Messwert".

Wäre dies möglich? Auch wenn dafür das Datenbankdesign geändert werden muss ist dies auch kein Problem.

Mein kläglicher Versuch (ist murks aber ich bekomme schon mal eine richtige Anzahl an DS)
PHP-Code:

SELECT f_sensoridsensornamemesswertzeitstempel FROM `sensor`
RIGHT JOIN messwert ON f_sensorid <= sensorid
WHERE 
(zeitstempel BETWEEN '$startdatum' AND '$enddatum') AND f_messeinheitid 
group by f_sensorid
zeitstempel
order by zeitstempel
f_sensorid ASC 

Ich hoffe, dass mein Beitrag für Euch verständlich war und es zu einer Lösungsfindung beträgt.

lg
Dietmar


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:48:20 Uhr.

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