© Tristan Roberts 2012
troberts @ this domain
<?php
    //  General things
    $debug_on = false;
    $size = 3;
    
    $matrix = array();
    $inverse = array();
    
    function makeOne($n) {
        global $debug_on;
        global $matrix;
        global $inverse;
        global $size;
        
        $val = $matrix[$n][$n];
        
        if($val == 0) {
            echo "ERROR: Cell (", $n + 1, ", ", $n + 1, ") must not be 0.\n";
        }
        
        $multiplier = (1/$val);
        
        if ($debug_on) {
            echo "Multiplier: ", $multiplier, "\n";
        }
        
        for($i = 0;$i < $size; $i++) {
            $matrix[$n][$i] *= $multiplier;
            $inverse[$n][$i] *= $multiplier;
        }
    }
    
    function makeZero($row, $cell) {
        global $matrix;
        global $inverse;
        global $size;
        global $debug_on;
        
        $val = $matrix[$row][$cell];
    
        if($val == 0) {
            return;
        }
        
        $op = -1 * $val;
        
        if($debug_on) {
            echo "Op: ", $op, "\n";
        }
        
        for ($i = 0;$i < $size;$i++) {
            $matrix[$row][$i]  += $op * $matrix[$cell][$i];
            $inverse[$row][$i] += $op * $inverse[$cell][$i];
        }
    }
    
    function getMatrix() {
        global $matrix;
        global $size;
        $i = 0;
        $j = 0;
        
        while ($i < $size && $j < $size) {
            $title = "Enter Value for (" . ($i + 1) . ", " . ($j + 1) . ")";
            $val = $matrix[$i][$j];
            $matrix[$i][$j] = " ?? ";
            displayMatrix($matrix, $title);
            $matrix[$i][$j] = $val;
            echo "Enter Value (", $i + 1, ", ", $j + 1, "): ";
            $s = trim(fgets(STDIN));
            if (is_numeric($s)) {
                $matrix[$i][$j] = (float) $s;
            }
            
            if ($j < ($size - 1)) {
                $j++;
            } else {
                $j = 0;
                $i++;
            }
        }
        
        displayMatrix($matrix, "Final Input");
        echo "Is this correct [y/N]? ";
        $s = strtolower(trim(fgets(STDIN)));
        
        if($s == "n" || $s == "0" || $s == "no") {
            getMatrix();
        } else {
            echo "\nCALCULATING…\n";
        }
    }
    
    function displayMatrix(&$matrix, $title = "Untitled") {
        global $size;
        
        $bar = "\n|" . str_repeat("-", ($size * 6) - 1) . "|\n";
        echo "\n", $title, " [MATRIX]: ", $bar;
        for ($i = 0;$i < $size;$i++) {
            for($j = 0;$j < $size;$j++) {
                $s = round($matrix[$i][$j], 2);
                if ($matrix[$i][$j] == " ?? ") {
                    $s = $matrix[$i][$j];
                }
                echo "| ", str_replace("-0", " 0", str_pad($s, 4, " ", STR_PAD_LEFT));
            }
            echo "|", $bar;
        }
        echo "\n";
    }
    
    function getSize() {
        global $size;
        global $matrix;
        global $inverse;
        
        echo "Enter matrix size: ";
        $size = (int) trim(fgets(STDIN));
        
        //  Populate the inverse matrix
        for($i = 0;$i < $size;$i++) {
            $matrix[$i] = array();
            $inverse[$i] = array();
            for ($j = 0;$j < $size;$j++) {
                $matrix[$i][$j] = 0;
                $inverse[$i][$j] = ($j == $i ? 1: 0);
            }
        }
    }
    
    getSize();
    getMatrix();
    
    for ($i = 0;$i < $size;$i++) {
        makeOne($i);
        displayMatrix($matrix, "Making One");
        
        for ($j = 0;$j < $size;$j++) {
            if($j != $i) {
                makeZero($j, $i);
                displayMatrix($matrix, "Making Zero");
            }
        }
    }
    
    displayMatrix($inverse, "Inverse");
?>