如何计算PHP中的对角线差异?

I have a N*N Matrix.Now i want to know the diagonal difference of this Matrix.What will be the best approach of this solution?

I am trying with given approach:

Such as it is 3*3 Matrix say it is:

11 15 85
66 72 21
14 21 47

the diagonal simple formula will be:

firstD= (11+72+47) = 130
secondD = (85+72+14)= 171
diagonalDiff = |firstD - secondD| = |130-171| = 41

If I count every row such as first to find out firstD (First row's first value + Sec row's Sec value + Third row's third value+..).This is my thinking. Can anyone tell me best approaches?

Try this:

$arr = array(
    array(11, 15, 85),
    array(66, 72, 21),
    array(14, 21, 47),
);

$arrDiag = count($arr);

$firstD = 0;
$secondD = 0;

$i = 0;
for($j = 0; $j < $arrDiag; $j++){
    $firstD += $arr[$i++][$j];
    $secondD += $arr[$arrDiag - $i][$j];
}

echo abs($firstD - $secondD);//41

Here is a pseudo code for your problem using one simple loop:

// $array - predefined 2 dimentional array with $N rows and $N columns
$result = 0;
for ($i=0;$i<$N;$i++)
{
 $result += ($array[$i,$i] - &array[$i,$N-$i-1]);
}

return echo abs($result);

that way you can do the calculation in one pass, and do a diff between two elements in each row insead of calculation the sum of each diagonal

Model your matrix with a multi-dimensional array and iterate through it. The easiest way should be the following:

<?
$matrix = array(array(1,2,3),array(4,5,6),array(7,8,9)); //Insert or define your matrix here..
$n = count($matrix); //Size of matrix, thanks to VolkerK
$firstD = 0;
$lastD = 0;

for($i = 0; $i < $n; $i++){
    $firstD += $matrix[$i][$i];
    $lastD += $matrix[$i][$n-$i-1];
}
echo $firstD."
";
echo $lastD;

This is the code you need:

$first = 0;
$second = 0;

for($i = 0; $i < N; $i++) {
    for($j = 0; $j < N; $j++) {
        if($i == $j) {
            $first += $matrix[$i][$j];
        } else if($i + $j == N) {
            $second += $matrix[$i][$j];
        }
    }
}

$diagonalDiff = abs($first - $second);

Where $matrix is a N*N array

you can try this :

$first_diag=$second_diag=0;
$matrix=array(array(11,15,85),array(66,72,21),array(14,21,47));
     foreach($matrix as $index=>$sub_array){
         $first_diag +=$sub_array[$index];
         $second_diag +=$sub_array[count($matrix)-1-$index];
     }

    print  abs ($first_diag-$second_diag);

For one you can use a matrix library like Math_Matrix. But if this is the only operation you are gona need then it's best to write a generalized function for this using the same method you quoted yourself.

function diagonalDiff($n){
  $firstD = 0;
  $secondD = 0;
  for($i=0;$i<$n;$i++){
    for($j=0;$j<$n;$j++){
      if($i == $j) {
        $first += $matrix[$i][$j];
    } else if($i + $j == $n) {
        $secondD += $matrix[$i][$j];
    }
    }
  }

  return abs($firstD-$secondD);
}

Should give you the answer you need for a matrix of a given size $n. (Only square Matrixes ofcourse :) )

Another better solution and it's easy to understand:

<?php
$arr = array(
    array(11, 15, 85),
    array(66, 72, 21),
    array(14, 21, 47),
);

$arrDiag = count($arr);

$firstD = 0;
$secondD = 0;

$i = 0;
for($j = 0; $j < $arrDiag; $j++){
    $i++;
    $firstD += $arr[$j][$j];
    $secondD += $arr[$arrDiag - $i][$j];
}

echo abs($firstD - $secondD);
?>

DEMO

Recently solved this question in Hacker Rank.

Just using the function array_reduce:

function diagonalDifference($arr) {
    $i = 0; 
    $n = count($arr);
    return abs(array_reduce($arr, 
        function  ($c, $str) use (&$i, $n ) {
        $i++;
        return $c + $str[$i-1] - $str[$n-$i];
   }, 0));
}

demo

<?php
$m=array(array(3,4,-1,11,2),
        array(-3,2,1,6,9),
        array(3,4,6,5,-2),
        array(1,9,9,7,-3),
        array(12,9,16,7,-3));
echo count($m)."<br>";  
$i=0;
$j=0;   
$ek=0;
$k=0;
$n=1;
$es=count($m)-1;
for($i=0;$i<count($m);$i++)
    {
      for($j=0;$j<count($m);$j++)
        {
          echo $m[$i][$j]."  ";
        }
       echo "<br>";
    }
echo "<br>";
for($k=0;$k<count($m);$k++)
    {
      for($n=0;$n<count($m);$n++)
        {
         if($k==$n){
             $ek=$ek+$m[$k][$n];
             }

        }
       echo "<br>";
    }
echo "<hr>";
$p=0;
for($k=0;$k<count($m);$k++)
    {
     echo $m[$k][$es-$p]."<br> ";
     $p++;
    }


?>

Try this:

function diagonalDifference($arr) {

  $left = 0;
  $right = 0;
  $i = 0;
  foreach($arr as $ar){
      $left+= $ar[0+$i];
      $right+= $ar[count($ar) - (1+$i)];
      $i++;
  }

  return abs($left - $right);
}