Вот код:
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
Формат — Клиент: время начала; время добавить; ожидаемое общее начальное время + добавленное время; значение массива после «обновления»; следующий экземпляр найденного клиента (и цикл продолжается).
Вам нужно получить ваш массив по ссылке, в противном случае вы просто обновляете новую переменную с именем $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
элемент, но фактическая ссылка на этот элемент.
По умолчанию переменные, созданные в циклах 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;
}
}
Лично мне легко пропустить&«Поэтому предпочитаю второй вариант, но я уверен, что это даже близко не к общему мнению.
Как сказано в PHP Manual: http://php.net/manual/en/control-structures.foreach.php
Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед $ value следует указать &, В этом случае значение будет присвоено по ссылке.