以下是代码:
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
格式为客户:初始时间;时间添加;预计的初始时间总和+增加的时间;更新后的数组值&#34 ;;找到客户的下一个实例(并且循环继续)。
答案 0 :(得分: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));
}
}
我在&
循环中的$cust
声明之前添加了foreach
。使用此$cust
不是具有当前$cust_cont
元素值的新变量,而是对此元素的实际引用。
答案 1 :(得分: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 :(得分:0)
正如PHP手册所说:http://php.net/manual/en/control-structures.foreach.php
为了能够直接修改循环中的数组元素,在$ value之前加上&amp ;.在这种情况下,该值将通过引用分配。