PHP变量不会在函数外部发生变化

时间:2016-02-22 06:31:54

标签: php arrays

我在PHP中有一个函数。我将两个数组作为引用传递给函数。虽然该函数在函数外部更新$array2,但它不会更新$array。以下是我的功能。

function JobAssign($i,&$array,&$array2,$Machine_Interchange) {
    $compmachine = $array[$i]['Machine_Name'];
    $CLT = $array[$i]["Estimated_Start_Date"];
    $ET = $array[$i]["Estimated_Completion_Date"];

    $Machine = $array[$i]['Machine_Name'];
    $Compatibility_sql = "SELECT Machine2 FROM Machine_Interchange where Machine1 = '$Machine' and Value = 1";
    $compatibility_query = mysql_query($Compatibility_sql) or die(mysql_error());
    for($i=0; $compatibility[$i] = mysql_fetch_assoc($compatibility_query);$i++);
    array_pop($compatibility);  
    $maxkey = max(array_keys($compatibility));
    $maxnumber = max(array_keys($array2))+1;
    $k=0;
    do{
        $compmachine = $compatibility[$k]['Machine2'];
        $CLT = $array2[$compmachine];
        if($array2[$compatibility[$k]['Machine2']]>$array2[$compatibility[$k+1]['Machine2']]) {
            $compmachine = $compatibility[$k+1]['Machine2'];
            $CLT = $array2[$compatibility[$k+1]['Machine2']];                                           
        }
        $k=$k+1;    
    }

    while($k<$maxkey);                                                  
    $array[$i]["Machine_Name"] = $compmachine;
    $array[$i]["Estimated_Start_Date"] = $CLT;                    
    $prodhours = $array[$i]["Prod_Hrs"];
    $array[$i]["Estimated_Completion_Date"] = date('Y-m-d H:i:s', strtotime($CLT . " +$prodhours hour"));
    $array2[$compmachine] = $array[$i]["Estimated_Completion_Date"];

    echo $array[$i]['Machine_Name'].'<br>';
    echo $array[$i]['Estimated_Start_Date'].'<br>';
    echo $array[$i]['Estimated_Completion_Date'].'<br>';
    echo $array2[$compmachine].'<br>';
}

JobAssign(0,$Jobs_Data,$LT,$Machine_Interchange);

echo $Jobs_Data[0]['Machine_Name'].'<br>';
echo $Jobs_Data[0]['Estimated_Start_Date'].'<br>';
echo $Jobs_Data[0]['Estimated_Completion_Date'].'<br>';
echo $LT['Machine 3'];

下面是我得到的输出。输出的前4行来自函数内部,接下来的4行来自函数外部。

Machine 3
2014-07-12 00:00:00
2014-07-15 11:00:00
2014-07-15 11:00:00
Machine 1
2014-07-30 00:00:00
2014-08-02 00:00:00
2014-07-15 11:00:00

当我回显函数内部已更改的变量时,它们会发生变化,但当我在函数外部回显$array时,它不会更改$array的值。只有$array2的值已更改,即使我已将两个数组作为参数传递给函数参数。这意味着第4行和第8行在输出中是相同的,这意味着$ array2的值已更改但不是$ array。

2 个答案:

答案 0 :(得分:0)

尝试将for循环中的变量$ i更改为另一个变量。因为它在循环时更改变量的值。

function JobAssign($i,&$array,&$array2,$Machine_Interchange)
{

$compmachine = $array[$i]['Machine_Name'];
$CLT = $array[$i]["Estimated_Start_Date"];
$ET = $array[$i]["Estimated_Completion_Date"];

$Machine = $array[$i]['Machine_Name'];
        $Compatibility_sql = "SELECT Machine2 FROM Machine_Interchange where Machine1 = '$Machine' and Value = 1";
                    $compatibility_query = mysql_query($Compatibility_sql) or die(mysql_error());
                    for($ii=0; $compatibility[$ii] = mysql_fetch_assoc($compatibility_query);$ii++);
                        array_pop($compatibility);  
                          $maxkey = max(array_keys($compatibility));
                          $maxnumber = max(array_keys($array2))+1;
                                            $k=0;
                                            do{
                                                $compmachine = $compatibility[$k]['Machine2'];
                                                $CLT = $array2[$compmachine];   
                                            if($array2[$compatibility[$k]['Machine2']]>$array2[$compatibility[$k+1]['Machine2']])
                                                {
                                                    $compmachine = $compatibility[$k+1]['Machine2'];                        
                                                    $CLT = $array2[$compatibility[$k+1]['Machine2']];                                                                                                           
                                                }
                                                $k=$k+1;    
                                              }
                                            while($k<$maxkey);                                                                                                              
$array[$i]["Machine_Name"] = $compmachine;
$array[$i]["Estimated_Start_Date"] = $CLT;                    
$prodhours = $array[$i]["Prod_Hrs"];
$array[$i]["Estimated_Completion_Date"] = date('Y-m-d H:i:s', strtotime($CLT . " +$prodhours hour"));                             
$array2[$compmachine] = $array[$i]["Estimated_Completion_Date"];

echo $array[$i]['Machine_Name'].'<br>';
echo $array[$i]['Estimated_Start_Date'].'<br>';
echo $array[$i]['Estimated_Completion_Date'].'<br>';
echo $array2[$compmachine].'<br>';
}

答案 1 :(得分:0)

$array已按原样更改,问题是在错误的索引中更改了。

<强>解释

您使用$i = 0调用该函数,但$i也在循环语句中使用,并以不同的值退出循环。

这是一行:

for($i=0; $compatibility[$i] = mysql_fetch_assoc($compatibility_query);$i++);

上述$i不再是0后(只要你有东西可以获取)

因此,您在函数内部回显的$array索引与您在函数外部回显的$array索引不同。

要解决您的问题,只需将上述循环的变量更改为其他内容,让我们说$j

for($j=0; $compatibility[$j] = mysql_fetch_assoc($compatibility_query);$j++);

因此不再影响$i