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);
Output for 5.6.38, 7.1.0 - 7.1.22, 7.2.0 - 7.2.33, 7.3.16 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.27, 8.4.1 - 8.4.14
array ( '2017-05-01' => array ( 'DC' => array ( 'IT' => 45, 'DE' => 54.5, 'Other' => 24.5, ), ), '2017-05-02' => array ( 'DC' => array ( 'IT' => 55, 'DE' => 4, 'Other' => 12, ), ), 'fringe case' => array ( 'DC' => array ( 'IT' => 0, 'DE' => 0, 'Other' => 49.5, ), ), )

preferences:
97.41 ms | 409 KiB | 5 Q