Search code examples
phparraysmultidimensional-arraygroupingdefault-value

Group 2d array data by a column and apply default values where a date key is missing


I have an array that looks like this...

[
    ['code' => 'AS34', '2014-12-10' => 32],
    ['code' => 'AS34', '2014-12-11' => 42],
    ['code' => 'AS34', '2014-12-12' => 40],
    ['code' => 'AS34', '2014-12-15' => 44],
    ['code' => 'AH98', '2014-12-10' => 1],
    ['code' => 'AT78', '2014-12-12' => 1],
    ['code' => 'AL44', '2014-12-10' => 23],
    ['code' => 'AL44', '2014-12-11' => 27],
    ['code' => 'AL44', '2014-12-13' => 25],
    ['code' => 'AL44', '2014-12-15' => 26],
]

I am trying to turn it into an array that looks like this...

$example_data = array(
    array(
        'ID'       => 1,
        'code'     => 'AS34',
        '09/12/14' => '0',
        '10/12/14' => '32',
        '11/12/14' => '42',
        '12/12/14' => '40',
        '13/12/14' => '0',
        '14/12/14' => '0',
        '15/12/14' => '44',
    ),
    array(
        'ID'       => 2,
        'code'     => 'AH98',
        '09/12/14' => '0',
        '10/12/14' => '1',
        '11/12/14' => '0',
        '12/12/14' => '0',
        '13/12/14' => '0',
        '14/12/14' => '0',
        '15/12/14' => '0',
    ),
    array(
        'ID'       => 3,
        'code'     => 'AT78',
        '09/12/14' => '0',
        '10/12/14' => '0',
        '11/12/14' => '0',
        '12/12/14' => '1',
        '13/12/14' => '0',
        '14/12/14' => '0',
        '15/12/14' => '0',
    ),
    array(
        'ID'       => 4,
        'code'     => 'AL44',
        '09/12/14' => '0',
        '10/12/14' => '23',
        '11/12/14' => '27',
        '12/12/14' => '0',
        '13/12/14' => '25',
        '14/12/14' => '0',
        '15/12/14' => '26',
    ),
);

So basically it sets up an array for each 'code' and then the previous 7 days.


Solution

  • I figured this:

    $data = Array
    (
        0 => Array
            (
                "id" => 1,
                "code" => "AS34",
                "2014-12-10" => 32
            ),
    
        1 => Array
            (
                "id" => 1,
                "code" => "AS34",
                "2014-12-11" => 42
            ),
    
        2 => Array
            (
                "id" => 1,
                "code" => "AS34",
                "2014-12-12" => 40
            ),
    
        3 => Array
            (
                "id" => 1,
                "code" => "AS34",
                "2014-12-15" => 44
            ),
    
        4 => Array
            (
                "id" => 1,
                "code" => "AH98",
                "2014-12-10" => 1
            ),
    
        5 => Array
            (
                "id" => 1,
                "code" => "AT78",
                "2014-12-12" => 1
            ),
    
        6 => Array
            (
                "id" => 1,
                "code" => "AL44",
                "2014-12-10" => 23
            ),
    
        7 => Array
            (
                "id" => 1,
                "code" => "AL44",
                "2014-12-11" => 27
            ),
    
        8 => Array
            (
                "id" => 1,
                "code" => "AL44",
                "2014-12-13" => 25
            ),
    
        9 => Array
            (
                "id" => 1,
                "code" => "AL44",
                "2014-12-15" => 26
            )
    );
    
    function in_array_r($needle, $haystack, $strict = false) { //taken from http://stackoverflow.com/a/4128377/4263082
    
        foreach ($haystack as $item) {
    
            if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
                return true;
            }
    
        }
    
        return false;
    }
    
    $codes = Array();
    $counter = -1;
    
    foreach($data as $key => $value) {
    
        if(!in_array_r($data[$key]["code"], $codes, true)) {
    
            $codes[++$counter] = Array();
    
            foreach($data[$key] as $subkey => $subvalue) {$codes[$counter][$subkey] = $subvalue;}
    
        }
        else{
    
            foreach($data[$key] as $subkey => $subvalue) {
    
                if($subkey != "code" && $subkey != "id") {$codes[$counter][$subkey] = $subvalue;}
    
            }
    
        }
    
    }
    
    print_r($codes);
    

    OUTPUT

    Array
    (
        [0] => Array
            (
                [id] => 1
                [code] => AS34
                [2014-12-10] => 32
                [2014-12-11] => 42
                [2014-12-12] => 40
                [2014-12-15] => 44
            )
    
        [1] => Array
            (
                [id] => 1
                [code] => AH98
                [2014-12-10] => 1
            )
    
        [2] => Array
            (
                [id] => 1
                [code] => AT78
                [2014-12-12] => 1
            )
    
        [3] => Array
            (
                [id] => 1
                [code] => AL44
                [2014-12-10] => 23
                [2014-12-11] => 27
                [2014-12-13] => 25
                [2014-12-15] => 26
            )
    
    )