PHP: передача массива через несколько функций - PullRequest
1 голос
/ 31 января 2012

Возможен ли этот код?

Глупый вопрос, но у меня возникла проблема с пониманием этого.Предполагая, что $product_quality[$i] и $saleprice[$i] уже заполнены значениями.Передача массива в функцию без указания ее ключа.

Пожалуйста, просто следуйте $product_value[$i] или $player_value

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

$product_value[$i]=($product_quality[$i]/$saleprice[$i]); 

}


$trial_x=find_four($product_value);



function find_four($player_value)
{

$trial_x=2;
$h=5;
$slope=1;

  while(abs($h)>0.01){

   $delta_y=total_value($player_value, $trial_x+0.01)-total_value($player_value, $trial_x)
   $slope=100*$delta_y;
   $h=-(total_value($player_value, $trial_x)-4)/$slope;
   $trial_x=$trial_x+$h;
  }

 return ($trial_x);
}


function total_value($player_value, $x)
{

 $total_value=0;

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

   $total_value+=Cum_Norm($x,$player_value[$i],$sd[$i]);
  }

return($total_value);
}


function Cum_Norm($x, $mean, $sd)
{
echo $x."****1****<br/><hr/>";
echo $mean."Should be empty?***2****<br/><hr/>";
echo $sd."*****3*****<br/><hr/>";
$z=($x-$mean)/$sd;
echo $z."*****4*****<br/><hr/>";

$b1=0.31938;
$b2=-0.35656;
$b3=1.78148;
$b4=-1.82126;
$b5=1.33027;
$c=0.3989423;

if ($z>=0)
{
   $t=1/(1+0.2316419*$z);
   echo $t."*****5*****<br/><hr/>";
   return (1.0 - $c * exp( -$z * $z / 2 ) * $t * ( $t *( $t * ( $t * ( $t * $b5 + $b4 ) + $b3 ) + $b2 ) + $b1 ));  
}

else
{
$t=1/(1-0.2316419*$z); 
echo $t."*****5*****<br/><hr/>";  
return ($c * exp( -$z * $z / 2 ) * $t * ( $t *( $t * ( $t * ( $t * $b5 + $b4 ) + $b3 ) + $b2 ) + $b1 ));  
}
 }

1 Ответ

3 голосов
/ 31 января 2012

весь массив $product_value передается как полный массив в функцию find_four(). Однако find_four() напрямую не использует значения в массиве $product_value. Вместо этого полный массив передается рядом с функцией total_value().

total_value() получает весь массив (называемый $player_value в области действия функции find_four()) и выполняет вычисления, используя все элементы массива. total_value() получает массив и использует его элементы внутри цикла for.

Из вашего вопроса не совсем ясно, что вы не понимаете, но, похоже, это часть передачи целого массива, а не отдельных значений. Массив может быть передан в функцию, и действительно все встроенные функции PHP array_*() зависят от этого поведения.

По умолчанию PHP передает массивы между функциями по значению, а не по ссылке, поэтому функция получает копию исходного массива, а не оригинала. Любые изменения, переданные функцией в передаваемый массив, являются только локальными изменениями.

Массивы (как и любые значения) могут передаваться по ссылке, как в function_call(&$array), поэтому изменения внутри function_call() изменят исходный массив, переданный ему. Некоторые встроенные модули, такие как sort(), принимают ссылку на массив, поэтому действуют на переданный исходный массив, не возвращая его и не присваивая его переменной.

$input_array = array(1,2,3,4,5);

// Pass the whole array to a function (by value)
function showArray($input_array) {
  print_r($input_array);
}

showArray($input_array);
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
...