Forum: PC-Programmierung php: bestimmte Werte aus array


von N1klas (Gast)


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...

von T.roll (Gast)


Lesenswert?

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

von N1klas (Gast)


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
}

von Daniel F. (df311)


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
}

von sid (Gast)


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

von N1klas (Gast)


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!

von T.roll (Gast)


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)


Lesenswert?

du benutzt mysql_fetch_assoc

Wieso nicht gleich Zeilenweise einlesen?
1
$result = mysql_query($query) or die(mysql_error());
2
3
4
while($row = mysql_fetch_array($result)){
5
  echo $row['Datum']. " - ". $row['x']." - ". $row['y'];
6
  echo "<br />";
7
}

von N1klas (Gast)


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 :/

von N1klas (Gast)


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?

von Philipp K. (philipp_k59)


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)


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
}

von N1klas (Gast)


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)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.