Forum: PC-Programmierung php: bestimmte Werte aus array


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von N1klas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe einen Array als Ergebnis einer SQL Abfrage. DAs liegt in einem 
Array vor und hat diese Struktur:
[{"Datum":"2020-04-01","x":"89.1","y":"2"},{"Datum":"2020-04-01","x":"88.9","y":"3"},{ . . .

mit array[1] bekomme ich ja z.B. den ersten Datensatz mit den 3 Werten.
Wenn ich aber im gesamten Array nur das "Datum"-Fomat ändern will,
ist es dann möglich mit einer Abfrage eben alle "Datum" Werte zu 
erhalten? Unabhängig der Länge des Arrays und unabhängig der anderen 
Werte.

array[1]['Datum'] liefert mir das Datum des ersten Datensatzes, kann ich 
die [1] durch etwas ersetzen, dass alle Datensätze beinhaltet?
Etwas wie array[*]['Datum'] mit dem Ergebnis
[{"Datum":"2020-04-01"},{"Datum":"2020-04-01"},{ . . .

Ich finde leider nichts passendes im Internet...

von T.roll (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du musst mit einer Schleife durch alle Elemente gehen. foreach bietet 
sich hier gut an.

von N1klas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das habe ich versucht. Aber bin leider nicht richtig vorangekommen.
Ich will von allen Datum-Werten im Array das Format ändern.
Ich würde also ungerne einen neuen Array entstehen lassen, sondern den 
vorhandenen verändern.

Kannst du mir vielleicht etwas auf die Sprünge helfen? Bin zwar 
grundsätzlich recht erfahren im Programmieren, aber PHP ist noch sehr 
frisch :/

Habe bisher das hier aufgestellt. Ich komme leider nicht wirklich weiter 
damit:
foreach ($data as ????) {
  $data['Datum'] = $data['Datum'].toISOString()
}

von Daniel F. (df311)


Bewertung
0 lesenswert
nicht lesenswert
N1klas schrieb:
foreach ($data as ????) {
   $data['Datum'] = $data['Datum'].toISOString()
}

der Ansatz ist nicht komplett falsch, aber die schleife passt nicht 
ganz.
php.net sagt dazu
https://www.php.net/manual/de/control-structures.foreach.php
foreach (array_expression as $key => $value)
    statement

das funktioniert so aber nur zum Iterieren. Wenn Werte geändert werden 
sollen, dann muss Value eine Referenz ("Pointer") werden, also sowas wie
foreach($array as &$value) {
    foo_bar($value);
}

von sid (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wilslt Du das nur ändern oder auch das geänderte im resultats-array 
peichern?
foreach ($sqlresult as $i=>$dataset) // Array aller SQL Zeilen zum query
{
    foreach($dataset as $key=>$value) // SQL Zeile in $dataset
    {
        if($key=="Datum") // SQL Spaltenname
        {
            $sqlresult[$i][$key] = mydatemodifier($value); // die Änderung
        }
    }
}
überschreibt die Daten in $sqlresult falls Du das brauchst.

'sid

von N1klas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
sid schrieb:
> Wilslt Du das nur ändern oder auch das geänderte im resultats-array
> peichern?

wo ist da der unterschied?
Ich habe den array nach der Sql Abfrage erstellt:
$data = array();
foreach ($result as $row) {
  $data[] = $row;
}

Innerhalb dieses $data arrays wollte ich die 'Datum' Werte eben ändern 
und auch speichern natürlich. Allerdings innherhalb dieses $data arrays. 
Also ohne das ein neuer Array entsteht.

Probiere gerade noch die beiden Ansätze von euch aus, schonmal vielen 
Dank!

von T.roll (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Halt mal! Warum formatierst du das Datum nicht direkt bei der Abfrage 
ins gewünschte Format? Dann sparst du dir das ganze umwandeln in PHP.

SELECT DATE_FORMAT(datenspalte, 'format') AS datum

von Philipp K. (philipp_k59)


Bewertung
0 lesenswert
nicht lesenswert
du benutzt mysql_fetch_assoc

Wieso nicht gleich Zeilenweise einlesen?
$result = mysql_query($query) or die(mysql_error());


while($row = mysql_fetch_array($result)){
  echo $row['Datum']. " - ". $row['x']." - ". $row['y'];
  echo "<br />";
}

von N1klas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
T.roll schrieb:
> Warum formatierst du das Datum nicht direkt bei der Abfrage
> ins gewünschte Format?
Sehr gute Idee, aber auch das bringt mich gerade zur Verzweiflung.
Müsste das hier nicht genau das erreichen?
SELECT DATE_FORMAT(`Zeit`, 'YYYY-MM-DDThh:mm:ss[.mmm]') AS Datum FROM Daten
Ich brauche das ISO8601 Format. Ich dachte das ich mit der obigen 
Abfrage dieses Format bekomme, allerdings ist der Wert der einzelnen 
Zeilen jetzt 'YYYY-MM-DDThh:mm:ss[.mmm]' das hier... Ich stehe etwas auf 
dem Schlauch.


Philipp K. schrieb:
> Wieso nicht gleich Zeilenweise einlesen?
Macht das für mich einen relevanten Unterschied? Am Ende habe ich doch 
auch ein array, mit den Werten. Ich will es ja nicht ausgeben, sondern 
als Json an ein Javascript-Script übergeben. Das klappt auch alles.
Lediglich für das Format des Datums bin ich zu blöd :/

von N1klas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
sid schrieb:
> Wilslt Du das nur ändern oder auch das geänderte im resultats-array
> peichern?
Daraus habe ich jetzt das hier gebastelt, was für mich eigentlich recht 
vielversprechend war.
foreach ($result as $i=>$data[]) // Array aller SQL Zeilen zum query
{
  foreach($data as $key=>$value) // SQL Zeile in $dataset
    {
        if($key=="Datum") // SQL Spaltenname
        {
       $time = strtotime($data[$i][$key]);        <--- Zeile 54
       $data[$i][$key] = date('c', $time);
        }
    }
}
Jetzt beschwert er sich aber hier:
Undefined offset: 0  on line <b>54</b>

Müsste ich in der markierten Zeile 54 mit dem Befehl nicht den 
entsprechenden "Datum"- Eintrag erwischen?

von Philipp K. (philipp_k59)


Bewertung
0 lesenswert
nicht lesenswert
So vielleicht.

SELECT SUBSTRING(DATE_FORMAT(`Zeit`,"%Y-%m-%dT%h:%m:%s.%f]"),1,23) AS 
DATUM from Daten;

von T.roll (Gast)


Bewertung
0 lesenswert
nicht lesenswert
N1klas schrieb:
> Müsste das hier nicht genau das erreichen?SELECT DATE_FORMAT(`Zeit`,
> 'YYYY-MM-DDThh:mm:ss[.mmm]') AS Datum FROM Daten
> Ich brauche das ISO8601 Format. Ich dachte das ich mit der obigen
> Abfrage dieses Format bekomme, allerdings ist der Wert der einzelnen
> Zeilen jetzt 'YYYY-MM-DDThh:mm:ss[.mmm]' das hier... Ich stehe etwas auf
> dem Schlauch.
Ähm, in MySQL/MariaDB schreibt man die Angaben im Format mit einem 
Prozentzeichen. Zum Beispiel %Y für die vierstellige Jahresangabe.

https://mariadb.com/kb/en/date_format/


Und da ich gerade mal etwas Zeit habe, eine PHP-Lösung...
(Verwende aber trotzdem die SQL-Variante, da die viel schneller ist.)
for($i = 0; $i < count($data); ++$i) {
    $data[$i]['Datum'] = $data[$i]['Datum'].toISOString();
}

von N1klas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank euch, und vor allem dir T.roll.
So klappen beide Varianten. Die SQL-Variante behebt das Problem 
natürlich direkt an der Quelle

von sid (Gast)


Bewertung
0 lesenswert
nicht lesenswert
N1klas schrieb:
> sid schrieb:
>> Wilslt Du das nur ändern oder auch das geänderte im resultats-array
>> peichern?
> Daraus habe ich jetzt das hier gebastelt, was für mich eigentlich recht
> vielversprechend war.foreach ($result as $i=>$data[]) // Array aller SQL
> Zeilen zum query
> {
>   foreach($data as $key=>$value) // SQL Zeile in $dataset
>     {
>         if($key=="Datum") // SQL Spaltenname
>         {
>        $time = strtotime($data[$i][$key]);        <--- Zeile 54
>        $data[$i][$key] = date('c', $time);
>         }
>     }
> }
> Jetzt beschwert er sich aber hier:Undefined offset: 0  on line <b>54</b>
> Müsste ich in der markierten Zeile 54 mit dem Befehl nicht den
> entsprechenden "Datum"- Eintrag erwischen?
weil es nicht $data[] ist sondern $data!
aber noch schlimmer:
das widerspricht sich mit
N1klas schrieb:
> wo ist da der unterschied?
> Ich habe den array nach der Sql Abfrage erstellt:$data = array();
> foreach ($result as $row) {
>   $data[] = $row;
> }
>
> Innerhalb dieses $data arrays wollte ich die 'Datum' Werte eben ändern


entweder $data ist die Zeile,
oder eben das array mit ALLEN ZEILEN des sql-queries

Also nochmal:
// $data ist ein Array von Arrays (zweidimensionales array)
foreach ($data as $index=>$sqlrow) // $data array aller rows
{
  // $sqlrow ist ein Array
  // im ersten durchlauf ist $sqlrow eine Kopie von $data[0]
  // im zweiten ist $sqlrow die Kopie von $data[1] etc.
  // änderst Du $sqlrow überschreibt das nicht $data[$index]!
  foreach($sqlrow as $key=>$value) // einzelne Spalten einer Zeile
  {
    // $key ist der Spaltenname, $value der Inhalt
    // jeweils als Kopie; wenn Du $value änderst ändert sich nichts an
    // $sqlrow und noch weniger and $data[$index]
    if($key=="Datum") 
    {
       // $value enthält schon den zu verändernden Wert, 
       // kein Grund nach $data[$index][$key] zu fischen
       // nochweniger eine Hilfsvariable zu bemühen wenn 
       // nur das Dein Ziel ist
       $data[$index][$key] = strtotime($value);

       // Denk daran, das überschreibt NUR $data[$index][$key]
       // nicht aber $value, und auch $sqlrow[$key] bleibt unverändert!
    }
  }
}

'sid

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.