意外的T_STRING错误(PHP)

I can normally catch these easy, but......

function linear_regression($x, $y) {

// calculate number points
$n = count($x);

// ensure both arrays of points are the same size
if ($n != count($y)) {

trigger_error("linear_regression(): Number of elements in coordinate arrays do not match.", E_USER_ERROR);

}

// calculate sums
$x_sum = array_sum($x);
$y_sum = array_sum($y);

$xx_sum = 0;
$xy_sum = 0;

for($i = 0; $i < $n; $i++) {

$xy_sum+=($x[$i]*$y[$i]);
$xx_sum+=($x[$i]*$x[$i]);

  }



  // calculate slope
  //$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / (($n * $xx_sum) - ($x_sum * $x_sum));

  $divisor = (($n * $xx_sum) – ($x_sum * $x_sum));
if ($divisor == 0){
 $m = 0;
} else {
$m = (($n * $xy_sum) – ($x_sum * $y_sum)) / $divisor;
}


  // calculate intercept
  $b = ($y_sum - ($m * $x_sum)) / $n;

  // return result
  return array("m"=>$m, "b"=>$b);

}

var_dump( linear_regression(array(1, 2, 3, 4, 4), array(1.5, 1.6, 2.1, 3.0, 6)) );

The error is happening here $divisor = (($n * $xx_sum) – ($x_sum * $x_sum));

Any ideas why?

The minus sign is a fancy unicode dash (I think the em dash) instead of the regular ascii - character.

I retyped the offending line like this:

$divisor = (($n*$xx_sum)-($x_sum * $x_sum));

The error disappeared. After a bit of poking the error seems to be related to the minus sign in the middle. deleting it and retyping it seems to fix the problem.

See this fiddle:

Adam is right, but also, you didn’t close the for loop. Here try this.

Also, the minus sign was the wrong sign here:

$divisor = (($n * $xx_sum) - ($x_sum * $x_sum));

As well as here:

$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / $divisor;

My cleaned up version of your function with the closed for loop in place as well here.

function linear_regression($x, $y) {

  // calculate number points
  $n = count($x);

  // ensure both arrays of points are the same size
  if ($n != count($y)) {
    trigger_error("linear_regression(): Number of elements in coordinate arrays do not match.", E_USER_ERROR);
  }

  // calculate sums
  $x_sum = array_sum($x);
  $y_sum = array_sum($y);

  $xx_sum = 0;
  $xy_sum = 0;

  for($i = 0; $i < $n; $i++) {

    $xy_sum+=($x[$i]*$y[$i]);
    $xx_sum+=($x[$i]*$x[$i]);

    // calculate slope
    //$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / (($n * $xx_sum) - ($x_sum * $x_sum));

    $divisor = (($n * $xx_sum) - ($x_sum * $x_sum));
    if ($divisor == 0) {
      $m = 0;
    }
    else {
      $m = (($n * $xy_sum) - ($x_sum * $y_sum)) / $divisor;
    }

    // calculate intercept
    $b = ($y_sum - ($m * $x_sum)) / $n;

  } 

  // return result
  return array("m"=>$m, "b"=>$b);

} // linear_regression

Don't ask me how I discovered that, but your "-" is not a real "-", is another character, but have the same apparence

Ok you didn't asked me, but I have discovered at http://writecodeonline.com/php/ , it doesn't recognize yours "-" character

Now working code with real "-", you can copy an paste, and see:

function linear_regression($x, $y) {

// calculate number points
$n = count($x);

// ensure both arrays of points are the same size
if ($n != count($y)) {

trigger_error("linear_regression(): Number of elements in coordinate arrays do not match.", E_USER_ERROR);

}

// calculate sums
$x_sum = array_sum($x);
$y_sum = array_sum($y);

$xx_sum = 0;
$xy_sum = 0;

for($i = 0; $i < $n; $i++) {

$xy_sum+=($x[$i]*$y[$i]);
$xx_sum+=($x[$i]*$x[$i]);

  }



  // calculate slope
  //$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / (($n * $xx_sum) - ($x_sum * $x_sum));

  $divisor = (($n * $xx_sum) - ($x_sum * $x_sum));
if ($divisor == 0){
 $m = 0;
} else {
$m = (($n * $xy_sum) - ($x_sum * $y_sum)) / $divisor;
}


  // calculate intercept
  $b = ($y_sum - ($m * $x_sum)) / $n;

  // return result
  return array("m"=>$m, "b"=>$b);

}

var_dump( linear_regression(array(1, 2, 3, 4, 4), array(1.5, 1.6, 2.1, 3.0, 6)) );