Zur Navigation

Array um Key mit dem Wert des vorherigen Keys erweitern

1 AndiN

Ich stehe gerade vor einem spannenden Problem.
Ich habe untenstehendes Array und möchte dieses wie folgt bearbeiten:

Array (
	[10.12.22] => x 
	[11.12.22] => x 
	[12.12.22] => x 
	[13.12.22] => x 
	[14.12.22] => x 
	[15.12.22] => x 
	[16.12.22] => x 
	[17.12.22] => x 
	[18.12.22] => x 
	[19.12.22] => x 
	[20.12.22] => x 
	[21.12.22] => x 
	[22.12.22] => 980 
	[23.12.22] => x 
	[24.12.22] => 995 
	[25.12.22] => 990 
	[26.12.22] => x 
	[27.12.22] => 995
	[28.12.22] => x 
	[29.12.22] => x )

1. Lösche alle Schlüssel mit dem Wert "x" bis zum ersten Schlüssel welcher einen Wert != x hat.

Danach sollte das Array also so aussehen:

Array (
	[22.12.22] => 980 
	[23.12.22] => x 
	[24.12.22] => 995 
	[25.12.22] => 990 
	[26.12.22] => x 
	[27.12.22] => 995
	[28.12.22] => x 
	[29.12.22] => x )

2. Ersetze alle Werte == x mit dem Wert des Schlüssels davor.

Ergebnis:

Array (
	[22.12.22] => 980 
	[23.12.22] => 980
	[24.12.22] => 995 
	[25.12.22] => 990 
	[26.12.22] => 990
	[27.12.22] => 995
	[28.12.22] => 995
	[29.12.22] => 995)

Wäre es hier evtl. einfacher das Array so aufzubauen?

Array (
	[0] => Array(10.12.22,x) 
	[1] => Array(11.12.22,x)
	[2] => Array(12.12.22,x)
	[3] => Array(13.12.22,x) 
	[4] => Array(14.12.22,x)
	[5] => Array(15.12.22,x) 
	[6] => Array(16.12.22,x)
	[7] => Array(17.12.22,x)
	[8] => Array(18.12.22,x)
	[9] => Array(19.12.22,x)
	[10] => Array(20.12.22,x)
	[11] => Array(21.12.22,x)
	[12] => Array(22.12.22,980) 
	[13] => Array(23.12.22,x)
	[14] => Array(24.12.22,995)
	[15] => Array(25.12.22,990)
	[16] => Array(26.12.22,x)
	[17] => Array(27.12.22,995)
	[18] => Array(28.12.22,x)
	[19] => Array(29.12.22,x))

Hintergrund: Das Array wird aus Einträgen einer Datenbank gefüllt welche nur einen Eintrag erzeugt, wenn sich ein Preis ändert. Im Array möchte ich die Tage "auffüllen" an welchen der Preis gleich geblieben ist.

29.12.2022 19:16

2 Jörg Kruse

Ich würde das Array in einer Schleife folgendermaßen neu aufbauen:

$new_array = [];
$previous_value = false;
foreach ($array as $key => $value) {
    if ($value == 'x') {
        if ($previous_value) {
            $new_array[$key] = $previous_value;
        }
    } else {
        $new_array[$key] = $value;
        $previous_value = $value;
    }
}

29.12.2022 20:30 | geändert: 29.12.2022 20:39

1 Forenmitglied fand diesen Beitrag gut

3 AndiN

Geniale Lösung! Vielen Dank! :-)

30.12.2022 01:18

... 1 Monat später ...

4 AndiN

Ich versuche das Skript gerade so umzubauen, dass es aus dem Ausgangs-Array

Array (
	[10.12.22] => x 
	[11.12.22] => x 
	[12.12.22] => x 
	[13.12.22] => x 
	[14.12.22] => x 
	[15.12.22] => x 
	[16.12.22] => x 
	[17.12.22] => x 
	[18.12.22] => x 
	[19.12.22] => x 
	[20.12.22] => x 
	[21.12.22] => x 
	[22.12.22] => 980 
	[23.12.22] => x 
	[24.12.22] => 995 
	[25.12.22] => 990 
	[26.12.22] => x 
	[27.12.22] => 995
	[28.12.22] => x 
	[29.12.22] => x )

Nicht das hier macht

Array (
	[22.12.22] => 980 
	[23.12.22] => 980 
	[24.12.22] => 995 
	[25.12.22] => 990 
	[26.12.22] => 990 
	[27.12.22] => 995
	[28.12.22] => 995 
	[29.12.22] => 995)

Sondern zusätzlich die Werte vor dem ersten Eintrag welcher nicht x ist ergänzt. Also so:

Array (
	[10.12.22] => 980 
	[11.12.22] => 980 
	[12.12.22] => 980 
	[13.12.22] => 980 
	[14.12.22] => 980 
	[15.12.22] => 980 
	[16.12.22] => 980 
	[17.12.22] => 980 
	[18.12.22] => 980 
	[19.12.22] => 980 
	[20.12.22] => 980 
	[21.12.22] => 980 
	[22.12.22] => 980 
	[23.12.22] => 980 
	[24.12.22] => 995 
	[25.12.22] => 990 
	[26.12.22] => 990 
	[27.12.22] => 995
	[28.12.22] => 995 
	[29.12.22] => 995 )

Leider beiße ich mir da die Zähne aus.
Hätte mir da jemand einen Tipp? :-)

08.02.2023 11:46

5 Jörg Kruse

Den ersten Wert ungleich x in einem Schleifendurchlauf finden und dann beim Neuaufbau des Arrays die x ohne vorherigen Wert damit ersetzen:

$new_array = [];
$previous_value = false;
$first_value = false;
foreach ($array as $key => $value) {
    if ($value != 'x') {
        $first_value = $value;
        break;
    }
}
foreach ($array as $key => $value) {
    if ($value == 'x') {
        if ($previous_value) {
            $new_array[$key] = $previous_value;
        } else {
            $new_array[$key] = $first_value;
        }
    } else {
        $new_array[$key] = $value;
        $previous_value = $value;
    }
}

08.02.2023 14:55 | geändert: 08.02.2023 14:55

1 Forenmitglied fand diesen Beitrag gut

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]