PHP:二次元配列のサブ配列の値を置換して新しい配列を作る。

// 回答者の数、設問の数
list($numOfPeople, $numOfQue) = explode(' ', trim(fgets(STDIN)));

$arr = [];

for($i = 0; $i < $numOfPeople; $i++) {
    $arr[] = explode(' ', trim(fgets(STDIN)));
}
// var_dump($arr[1][0]); // string型

$newArr = [];
// 数値でない場合、XXX に置換して、新しい配列を作る。
foreach ($arr as $subArr) {
    $newSubArr = [];
    foreach ($subArr as $val) {
        if (!is_numeric($val) || !calNumZeroOrHundreds($val))  {
            $val = 'XXX';
        }
        $newSubArr[] = $val;
    }
    $newArr[] = $newSubArr;
}
// print_r($newArr);

// 0 <= N <= 100 以外は、切り捨てる。
function calNumZeroOrHundreds(float $num): bool
{
    if($num < 0 || 100 < $num) {
        return false;
    }
    return true;
}

// 設問ごとの配列に直す。つまり、縦列の配列に並び替える。
$arrColumn = [];
for($i = 0; $i < $numOfPeople; $i++) {
  foreach ($newArr[$i] as $key => $value) {
    if (!isset($arrColumn[$key])) {
      $arrColumn[$key] = [];
    }
    $arrColumn[$key][] = $value;
  }
}
// print_r($arrColumn);

// 各サブ配列の平均値を出して、出力して完成。
$avgs = [];
foreach ($arrColumn as $subArray) {
    $sum = 0;
    $count = 0;
    foreach ($subArray as $value) {
        if (is_numeric($value)) {
            $sum += $value;
            $count++;
        }
    }
    $avgNum = ($count > 0) ? $sum / $count : 0;
    echo floor($avgNum) . PHP_EOL;
}