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; 
    } 
} 

は個人的に私はそれが簡単に欠場する見つける「&」ので2番目のオプションを好むが、私はそれが普遍的意見にさえ近くないと確信しています。 PHPマニュアルとして

+0

これは私が働くと思ったことが働いていない理由を説明しています。通常、私は**あなたの2番目のメソッドで配列を設定しますが、私が何をしたかは何らかの理由で行います。手伝ってくれてどうもありがとう!! – dmcoding

関連する問題