phparraysmultidimensional-arrayreducecounting

Count items in each subarray to produce an associative array of unique keys and counts


As you can see from the following array, there are three elements that appear on Nov 18, and another two elements that appear on Nov 22. Can someone tell me how I can retrieve the counts of 3 and 2 respectively from this array? Basically, I want to end up with a result something like this:

Nov 18, 2011 = 3 items

Nov 22, 2011 = 2 items

Of course, the dates and the number of different dates will vary every time. Here is the array:

[
    [
        ['2011-11-18 00:00:00' => 'C'],
        ['2011-11-18 00:00:00' => 'I'],
        ['2011-11-18 00:00:00' => 'S']
    ],
    [
        ['2011-11-22 00:00:00' => 'C'],
        ['2011-11-22 00:00:00' => 'S']
    ]
]

Solution

  • Does this work for what you need?

    $dates = array(array(array("2011-11-18 00:00:00" => C), array("2011-11-18 00:00:00" => I),array
    ("2011-11-18 00:00:00" => S)),
    array(array("2011-11-22 00:00:00" => C), array("2011-11-22 00:00:00" => S)));
    
    $date_count = array();  // create an empty array
    
    foreach($dates as $date) {  // go thought the first level
        foreach($date as $d) {  // go through the second level
            $key = array_keys($d);  // get our date
            // here we increment the value at this date
            // php will see it as 0 if it has not yet been initialized
            $date_count[$key[0]]++;
        }
    }
        // show what we have
    print_r($date_count);
    

    Prints:

    Array ( [2011-11-18 00:00:00] => 3 [2011-11-22 00:00:00] => 2 )
    

    Note: this assumes that you will always be getting data as you structured your array and that each date will be formatted the same. If you can't assume each date will be formatted, this would be a simple conversion using the date() function. If you can't assume that you will get data structured exactly like this, the best way to tackle that would probably be through a recursive function.