Временное обновление массива, но не постоянное обновление в переполнении стека

Вот код:

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 в массиве, и я хочу добавить в hoursThisPer customer1, он выполняет действия по добавлению к этому месту. Тем не менее, в следующий раз, когда ему нужно будет обновить, hours1isThisPer клиента устанавливается на начальное значение, а не обновленное значение. Я не могу понять недостаток в моей логике. Помощь будет принята с благодарностью. У меня есть пример вывода.

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

Формат — Клиент: время начала; время добавить; ожидаемое общее начальное время + добавленное время; значение массива после «обновления»; следующий экземпляр найденного клиента (и цикл продолжается).

1

Решение

Вам нужно получить ваш массив по ссылке, в противном случае вы просто обновляете новую переменную с именем $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 элемент, но фактическая ссылка на этот элемент.

2

Другие решения

По умолчанию переменные, созданные в циклах foren (в данном случае $ 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;
}
}

Лично мне легко пропустить&«Поэтому предпочитаю второй вариант, но я уверен, что это даже близко не к общему мнению.

1

Как сказано в PHP Manual: http://php.net/manual/en/control-structures.foreach.php

Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед $ value следует указать &, В этом случае значение будет присвоено по ссылке.

0