3v4l.org

run code in 300+ PHP versions simultaneously
<?php $array=[ '2017-05-01'=>[ 'DC'=>[ 'IT'=>[90, 0], 'DE'=>[18, 315, 40, '', 69, 211], 'Other'=>[107, 46, '', '', 27, 22] ] ], '2017-05-02'=>[ 'DC'=>[ 'IT'=>[70, 40, 55], 'DE'=>['', 31, 4, '', 9], 'Other'=>[1107, 12, 0, 20, 1, 11, 21] ] ], 'fringe case'=>[ 'DC'=>[ 'IT'=>[], 'DE'=>['', '', '', 99], 'Other'=>['', 99] ] ] ]; foreach ($array as $k1 => $lv1) { foreach ($lv1 as $k2 => $lv2) { foreach ($lv2 as $k3 => $lv3) { sort($lv3); // order values ASC $count = sizeof($lv3); // count number of values $index = floor($count / 2); // get middle index or upper of middle two if (!$count) { // count is zero $medians[$k1][$k2][$k3] = 0; } elseif ($count & 1) { // count is odd $medians[$k1][$k2][$k3] = (int)$lv3[$index]; // single median } else { // count is even $medians[$k1][$k2][$k3] = ((int)$lv3[$index-1] + (int)$lv3[$index]) / 2; // dual median } } } } var_export($medians);

preferences:
27.07 ms | 406 KiB | 5 Q