简体   繁体   中英

Array check if date exist in array from period date range fill values from last array PHP

Hope this post is not a duplicate, I've looking for a solution but I'm really stuck, maybe somebody pass trough this and has a solution.

I have a set of array that pass into a graph, the desire graph need to show all the data even if in the desired day doesn't exist value for one sub array data.

This is my array:

$setData = array(
            '2017-06-21' => array(
                'gender1' => array(
                    'value1' => 100,
                    'value2' => 100,
                    'value3' => 100,
                ),
                'gender2' => array(
                    'value1' => 200,
                    'value2' => 200,
                    'value3' => 200,
                ),
                'gender3' => array(
                    'value1' => 300,
                    'value2' => 300,
                    'value3' => 300,
                )
            ),
            '2017-06-22' => array(
                'gender1' => array(
                    'value1' => 90,
                    'value2' => 90,
                    'value3' => 90,
                ),
                'gender3' => array(
                    'value1' => 200,
                    'value2' => 200,
                    'value3' => 200,
                )
            ),
            '2017-06-23' => array(
                'gender2' => array(
                    'value1' => 150,
                    'value2' => 150,
                    'value3' => 150,
                ),
                'gender3' => array(
                    'value1' => 150,
                    'value2' => 150,
                    'value3' => 150,
                )
            ),
        );

So, at this way on date 22 in the graph will dissapear the line or bar stack for gender 2 and on 23 for gender 1, what i need is to keep the line or bar stack even if in 22 i don't have values for gender 2 and on 23 values for gender 1

The desired result should be:

$setDataNeed = array(
            '2017-06-21' => array(
                'gender1' => array(
                    'value1' => 100,
                    'value2' => 100,
                    'value3' => 100,
                ),
                'gender2' => array(
                    'value1' => 200,
                    'value2' => 200,
                    'value3' => 200,
                ),
                'gender3' => array(
                    'value1' => 300,
                    'value2' => 300,
                    'value3' => 300,
                )
            ),
            '2017-06-22' => array(
                'gender1' => array(
                    'value1' => 90,
                    'value2' => 90,
                    'value3' => 90,
                ), 
                /* Keep values from gender2 from 21 date*/
                'gender2' => array(
                    'value1' => 200,
                    'value2' => 200,
                    'value3' => 200,
                ),
                'gender3' => array(
                    'value1' => 200,
                    'value2' => 200,
                    'value3' => 200,
                )
            ),
            '2017-06-23' => array(
                /* Keep values for gender1 from 22 date*/
                'gender1' => array(
                    'value1' => 90,
                    'value2' => 90,
                    'value3' => 90,
                ),
                'gender2' => array(
                    'value1' => 150,
                    'value2' => 150,
                    'value3' => 150,
                ),
                'gender3' => array(
                    'value1' => 150,
                    'value2' => 150,
                    'value3' => 150,
                )
            ),
        );

Simply remember previous row and insert it if needed.

function prepare($aIn) {
    $aRes = array();
    $prev = array();
    $keys = array('gender1', 'gender2', 'gender3',);

    foreach ($aIn as $row) {
        foreach ($keys as $k) {
            if (!isset($row[$k]) && isset($prev[$k])) {
                $row[$k] = $prev[$k];
            }
        }

        $aRes[] = $row;
        $prev = $row;
    }

    return $aRes;
}

Other way of doing this. It keeps the keys.

 $previousValue = null;
 foreach($setData as $key=>$value){;
     if($previousValue) {
        $setData[$key] = array_replace_recursive($previousValue,$value);
     }
     $previousValue = $value;    
 }
print_r($setData);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM