2016-02-22 4 views
1

У меня есть функция в PHP. Я передаю два массива функции в качестве ссылок. Хотя функция обновляет $array2 вне функции, она не обновляет $array. Ниже моя функция.PHP-переменные, не изменяющиеся вне функции

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']; 

Ниже вывод, что я get.The первые 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.

+0

Где вы звоните в 'функцию JobAssign'? –

+0

Я вызываю функцию после того, как она определена и передает 2 разных массива для $ array и $ array2. – MaverickPablo

+0

Пожалуйста, добавьте ваш вопрос, чтобы его можно было проверить. –

ответ

0

Попробуйте изменить переменную $ i на ваш цикл for на другую переменную. Потому что он изменяет значение переменной во время цикла.

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>'; 
} 
+0

Ссылка на вызов-время была удалена в строке, которая представляет собой $ array3 = $ this-> JobAssign ($ i, & array, & $ array2, $ Machine_Interchange); – MaverickPablo

+0

@SujayMahale жаль, что я положил знак '&' при вызове функции –

+0

благодарю вас за помощь. Это все еще не работает. Кроме того, весь мой план состоит в том, чтобы использовать функцию для каждого ключа массива для '$ ​​array'. Каждый раз, когда я использую его для ключа, массив $ array2 обновляется как вход для следующего использования функции для следующего ключа в '$ array'. Но почему это не обновляет переменные в массиве $, когда я передаю его как ссылку в аргументе функции. – MaverickPablo

0

The $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

+0

Это очень помогло. Глупая ошибка. Огромное спасибо. :-) – MaverickPablo

Смежные вопросы