У меня есть массив, давайте назовем его $ order, который выглядит следующим образом
Array (
[0] => stdClass Object (
[model] => Test Model Number 900
[quantity] => 100
[retail_per_unit] => 50.0000)
[1] => stdClass Object (
[model] => model 2
[quantity] => 5
[retail_per_unit] => 100.0000 )
затем я зацикливаюсь на $ order для выполнения некоторых вычислений и получения другого массива, назовем его $ total
так что мой массив $ total выглядит так
Array (
[0] => 5000
[1] => 500
)
Теперь я хочу вставить пару ключ-значение обратно в массив, чтобы он стал
Array (
[0] => stdClass Object (
[model] => Test Model Number 900
[quantity] => 100
[retail_per_unit] => 50.0000
[total] => 5000)
[1] => stdClass Object (
[model] => model 2
[quantity] => 5
[retail_per_unit] => 100.0000
[total] => 500)
Я старался
$ order [‘total’] = $ total;
и я получаю Косвенное изменение перегруженного свойства $ order не имеет никакого эффекта.
как правильно делать это
Метод цикла for, кажется, делает то, что я хочу, но я все еще получаю косвенную ошибку. Вот некоторая дополнительная информация, которая может быть связана с этим.
мой массив $ order на самом деле
$template->order
он получает массив объектов, как это
$template->order = $someClass->someQuery($id);
и $ template вызывает класс
$template = new Template(dirname(__DIR__).'/templates/templatepage.php');
может быть, $ template-> order как-то меняет синтаксис?
Почему бы просто не подвести итоги на ходу?
foreach ($order as $x) {
$x->total = $x->quantity * $x->retail_per_unit;
}
Просто используй добро for
цикл:
$count = count($order);
for($i = 0; $i < $count; $i++) {
$order[$i]->total = $total[$i];
}
Обратите внимание на каждый элемент внутри $order
это объект. Так что используйте ->
обозначение стрелки, чтобы установить другое свойство.
Вы можете сделать все это в существующем цикле foreach, который вы используете для вычисления нового итогового значения, а не использования двух массивов и последующего их слияния.
foreach ( $orders as &$order) {
// do calulations to get $total
$order->total = $total;
}
Обратите внимание на использование &
в &$order
это позволяет вам получить доступ к этому массиву в то время как все еще в цикле foreach и важно, не опечатка
Фактически, так как массив на самом деле содержит объекты, и объекты все равно передаются как ссылки, &
не требуется в этом случае, но все еще работает, если он там есть. Если во внешнем массиве хранится что-то еще, то &
будет необходимо, так что это, вероятно, хорошая практика и помогает с самодокументированным кодом оставить его, чтобы напомнить следующему разработчику, что делается.
Ваш $order
массив содержит объекты, а не массивы. Вы пытаетесь получить доступ к объектам, но вы используете нотацию массива. Изменить:
$order['total'] = $total
к
$order[0]->total = $total
Чтобы сделать это относительно просто, вы должны сначала сделать это:
array_push($order,'5000')