php: bestimmte Werte aus array

Gast #6247943
Lesenswert?

Hallo,
ich habe einen Array als Ergebnis einer SQL Abfrage. DAs liegt in einem 
Array vor und hat diese Struktur:
1
[{"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
1
[{"Datum":"2020-04-01"},{"Datum":"2020-04-01"},{ . . .

Ich finde leider nichts passendes im Internet...
Gast #6247996
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:
1
foreach ($data as ????) {
2
  $data['Datum'] = $data['Datum'].toISOString()
3
}
#6248108
Lesenswert?

N1klas schrieb:
1
foreach ($data as ????) {
2
   $data['Datum'] = $data['Datum'].toISOString()
3
}

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
1
foreach (array_expression as $key => $value)
2
    statement

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

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

'sid
Gast #6248300
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:
1
$data = array();
2
foreach ($result as $row) {
3
  $data[] = $row;
4
}

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!
Gast #6248540
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?
1
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 :/
Gast #6248555
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.
1
foreach ($result as $i=>$data[]) // Array aller SQL Zeilen zum query
2
{
3
  foreach($data as $key=>$value) // SQL Zeile in $dataset
4
    {
5
        if($key=="Datum") // SQL Spaltenname
6
        {
7
       $time = strtotime($data[$i][$key]);        <--- Zeile 54
8
       $data[$i][$key] = date('c', $time);
9
        }
10
    }
11
}
Jetzt beschwert er sich aber hier:
1
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?
Gast #6248731
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.)
1
for($i = 0; $i < count($data); ++$i) {
2
    $data[$i]['Datum'] = $data[$i]['Datum'].toISOString();
3
}
Gast #6249575
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:
1
// $data ist ein Array von Arrays (zweidimensionales array)
2
foreach ($data as $index=>$sqlrow) // $data array aller rows
3
{
4
  // $sqlrow ist ein Array
5
  // im ersten durchlauf ist $sqlrow eine Kopie von $data[0]
6
  // im zweiten ist $sqlrow die Kopie von $data[1] etc.
7
  // änderst Du $sqlrow überschreibt das nicht $data[$index]!
8
  foreach($sqlrow as $key=>$value) // einzelne Spalten einer Zeile
9
  {
10
    // $key ist der Spaltenname, $value der Inhalt
11
    // jeweils als Kopie; wenn Du $value änderst ändert sich nichts an
12
    // $sqlrow und noch weniger and $data[$index]
13
    if($key=="Datum") 
14
    {
15
       // $value enthält schon den zu verändernden Wert, 
16
       // kein Grund nach $data[$index][$key] zu fischen
17
       // nochweniger eine Hilfsvariable zu bemühen wenn 
18
       // nur das Dein Ziel ist
19
       $data[$index][$key] = strtotime($value);
20

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

'sid

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren