Mam tę wielowymiarową tablicę w PHP:

Array
(
    [47] => Array
        (
            [2019-02-24] => Array
                (
                    [AVA_Id] => 1
                    [AVA_Status] => Open
                )
            [2019-02-25] => Array
                (
                    [AVA_Id] => 3
                    [AVA_Status] => Open
                )
            [2019-02-28] => Array
                (
                    [AVA_Id] => 4
                    [AVA_Status] => Close
                )
        )
    [48] => Array
        (
            [2019-02-26] => Array
                (
                    [AVA_Id] => 2
                    [AVA_Status] => Open
                )
        )
)

Jak dla znanego zakresu daty mogę wypełnić tę tablicę z brakującymi datami?

Mój zakres dat jest następujący:

Array ( [0] => 2019-02-24 [1] => 2019-02-25 [2] => 2019-02-26 [3] => 2019-02-27 [4] => 2019-02-28 [5] => 2019-03-01 [6] => 2019-03-02 )

Na przykład, dla tablicy z kluczem 47, musiałbym dodać brakujące daty: 2019-02-26, 2019-02-27, 2019-03-01 i 2019-03-02, ponieważ te daty są zakres dat, ale nie w tablicy pod kluczem 47. To samo dla klucza 48.

Moja próba była ta:

foreach($daterange as $date){
    $date = $date->format('Y-m-d');
    if(in_array($myarray[$date]))
        $newarray[$date] = $myarray[$date];
    else
        $newarray[$date] = 0;
}
1
PacPac 25 luty 2019, 01:14

2 odpowiedzi

Najlepsza odpowiedź

Zasadniczo musisz pętli przez każdy element tablicy, a następnie sprawdzić, czy każda data jest obecna jako klucz w tablicy. Jeśli nie, dodamy "pusty" element do tej daty:

foreach ($array as &$arr) {
    foreach ($dates as $date) {
        if (!in_array($date, array_keys($arr))) {
            $arr[$date] = array('AVA_Id' => 0, 'AVA_Status' => 'no');
        }
    }
}
print_r($array);

Wyjście jest dość długi, więc pominiłem go, ale widać to w tym Demo na 3v4l.org

Aby posortować klucze tablicy według daty, dodaj ksort do pętli:

foreach ($array as &$arr) {
    foreach ($dates as $date) {
        if (!in_array($date, array_keys($arr))) {
            $arr[$date] = array('AVA_Id' => 0, 'AVA_Status' => 'no');
        }
    }
    ksort($arr);
}

demo na 3v4l.org

Aktualizuj

Jak wskazano w komentarzach @Trincot, powyższe można odpowiedzieć bardziej wydajnie przy użyciu isset, a nie in_array:

foreach ($array as &$arr) {
    foreach ($dates as $date) {
        $arr[$date] = isset($arr[$date]) ? $arr[$date] : array('AVA_Id' => 0, 'AVA_Status' => 'no');
    }
    ksort($arr);
}

Demo na 3v4l.org

Lub przy użyciu operatora Null Coalescing ?? w php7 w górę:

foreach ($array as &$arr) {
    foreach ($dates as $date) {
        $arr[$date] = $arr[$date] ?? array('AVA_Id' => 0, 'AVA_Status' => 'no');
    }
    ksort($arr);
}

Demo na 3v4l.org

Aktualizacja 2

Kod może być jeszcze bardziej wydajny za pomocą tymczasowej tablicy w pętli, która usuwa potrzebę ksort:

foreach ($array as &$arr) {
    foreach ($dates as $date) {
        $out[$date] = $arr[$date] ?? array('AVA_Id' => 0, 'AVA_Status' => 'no');
    }
    $arr = $out;
}

Demo na 3v4l.org

Uwaga

Jak wskazano @dwinder, możesz użyć array_diff między tablicą {x1}} i klawiszami każdego elementu tablicy, aby znaleźć nowe wpisy wymagane:

foreach ($array as &$arr) {
    foreach (array_diff($dates, array_keys($arr)) as $date) {
        $arr[$date] = array('AVA_Id' => 0, 'AVA_Status' => 'no');
    }
    ksort($arr);
}

Demo na 3v4l.org

2
Nick 25 luty 2019, 00:24

Dlaczego nie zaczynać się od pustej tablicy daty, a następnie skopiuj rzeczywiste elementy do tej tablicy.

$template = array_fill_keys($daterange,['AVA_Id' => 0,'AVA_Status' => 'No']);

foreach ($outer as $ind => $dates) {

   $output[$ind] = $template;

   foreach ($dates as $d => $v) {

       $output[$ind][$d] = $v;

   }

 }

Demo na 3v4l.org

1
lufc 24 luty 2019, 23:39