2016-06-23 2 views
1

에 영구적으로 업데이트되지 여기 코드는 다음과 같습니다배열이 일시적으로 업데이트하지만, PHP

if($condition == 'condition1' || $condition == 'condition2') 
{ 
    $found = false; 
    //loop through the array of customers contracts 
    foreach($cust_cont as $cust) 
    { 
     //if the customer is found 
     if ($cust["customer"] == $customer) 
     { 
      $temp = floatval($cust["hoursThisPer"]); 
      $temp += $time; 
      $cust["hoursThisPer"] = $temp; 
      $found = true; 
     } 
    } 
    if ($found == false) 
    { 
     $cust_cont[] = array("customer" => "$customer", "hoursUsed" => $hoursUsed, 
      "hoursAvail" => $allowed, "hoursThisPer" => (0 + $time)); 
    } 
} 

그래서, 나는이 뭘 얻기 위해 노력하고있어 것은 배열을 통과합니다. 배열에 고객 번호가 인 경우 해당 고객의 사용 시간을 추가하고 싶습니다. 이 아닌이 고객의 항목 인 경우 해당 고객의 항목을 내 배열에 만들고 해당 값을 초기화하고 싶습니다.

배열의 항목이 제대로 초기화되고 있지만 업데이트하려고하면 펑키가 발생합니다. 예를 들어 배열에 customer1이 있고 customer1의 hoursThisPer에 추가하려는 경우 해당 위치에 추가하는 동작을 진행합니다. 그러나 다음에 업데이트해야 할 경우 customer1의 hoursThisPer는 업데이트 된 값과 반대되는 초기 값으로 설정됩니다. 나는 내 논리의 결함을 알아낼 수 없다. 도움말 크게 감사하겠습니다. 샘플 출력이 있습니다.

Customer1:0.25 

time: 0.25 

temp: 0.5 

0.5 

Customer1:0.25 

time: 1.50 

temp: 1.75 

1.75 

Customer1:0.25 

time: 0.50 

temp: 0.75 

0.75 

형식은 고객입니다 : 초기 시간; 추가 할 시간; 초기 시간 + 추가 시간의 예상 총계; 갱신 후의 배열의 값. 발견 된 고객의 다음 인스턴스 (그리고주기가 계속됨).

+2

foreach의 배열을 변경하려면 'foreach ($ cust_cont as & $ cust)' – splash58

+0

그건 작동합니다! 고마워요! 나는 솔직하게 말하지만, 나는 그것이 왜 효과가 있는지 모른다. 그게 무엇이고 왜 효과가 있었는지 내게 말할 수있는 방법이 있습니까? – dmcoding

+0

@dmcoding 변수 앞의'&'기호는 참조로 전달합니다. 복사본으로'$ cust'보다 이것을 더하지 않으면 배열의 값에 대한 참조가 없습니다. –

답변

2

당신은 그렇지 않으면 당신은 단지 $cust라는 새 변수를 업데이트하고, 참조하여 배열을 가져해야합니다

여기
if($condition == 'condition1' || $condition == 'condition2') 
{ 
    $found = false; 
    //loop through the array of customers contracts 
    foreach($cust_cont as &$cust) 
    { 
     //if the customer is found 
     if ($cust["customer"] == $customer) 
     { 
      $temp = floatval($cust["hoursThisPer"]); 
      $temp += $time; 
      $cust["hoursThisPer"] = $temp; 
      $found = true; 
     } 
    } 
    if ($found == false) 
    { 
     $cust_cont[] = array("customer" => "$customer", "hoursUsed" => $hoursUsed, 
      "hoursAvail" => $allowed, "hoursThisPer" => (0 + $time)); 
    } 
} 

은 내가 foreach 루프에 &$cust 전에 선언을했다. 이 $cust은 현재 $cust_cont 요소의 값을 가진 새로운 변수가 아니지만이 요소에 대한 실제 참조입니다.

+1

나는 대답을 처음으로 설명했기 때문에 대답을 주로 선택했습니다.도와 주셔서 정말 고맙습니다. – dmcoding

+1

'foreach' 루프가 닫힌 후에'$ cust'를 사용하는 것을 잊지 마세요 !!!!! – MonkeyZeus

1

기본적으로 foreach 루프 (이 경우 $ cust)로 만든 변수는 참조가 아닌 값으로 만들어집니다. (주석에 splash58에 의해 제안 등의 &와 접두사로) 당신은 당신이 생성 된 변수를 변경하여 원래의 배열을 변경 할 수 있도록 참조로 전달을 변경할 수 있습니다 중 하나

foreach($cust_cont as &$cust) 
{ 
    //if the customer is found 
    if ($cust["customer"] == $customer) 
    { 
     $temp = floatval($cust["hoursThisPer"]); 
     $temp += $time; 
     $cust["hoursThisPer"] = $temp; 
     $found = true; 
    } 
} 

또는 당신은 또한 수 관련 색인을 얻고 배열을 직접 편집하십시오.

foreach($cust_cont as $index => $cust) 
{ 
    //if the customer is found 
    if ($cust["customer"] == $customer) 
    { 
     $temp = floatval($cust["hoursThisPer"]); 
     $temp += $time; 
     $cust_cont[$index]["hoursThisPer"] = $temp; 
     $found = true; 
    } 
} 

는 개인적으로 나는 쉽게 놓칠 찾아 "&"그래서 두 번째 옵션을 선호하지만 난 그 보편적 인 의견에 근처에도없는 확신 해요.

+0

아, 제가 생각하기에 일하는 것이 효과가없는 이유를 설명합니다. 일반적으로 나는 두 번째 방법으로 배열을 설정하지만, 내가 한 일이 아닌 이유가 무엇이든간에. 도와 주셔서 정말 감사합니다!! – dmcoding