Php 将新数据追加到对象
我一直在尝试将新数据附加到为AMchart创建的stdClass对象 我从数据库返回我想要的所有行,然后创建一个新对象并在返回的数组中循环,但不是将我想要的附加到现有对象的末尾,它只是被覆盖。PHP对象没有append或push方法,那么如何实现这一点呢 下面是我的代码。我错过了一些简单的东西吗Php 将新数据追加到对象,php,json,object,Php,Json,Object,我一直在尝试将新数据附加到为AMchart创建的stdClass对象 我从数据库返回我想要的所有行,然后创建一个新对象并在返回的数组中循环,但不是将我想要的附加到现有对象的末尾,它只是被覆盖。PHP对象没有append或push方法,那么如何实现这一点呢 下面是我的代码。我错过了一些简单的东西吗 $sql = 'SELECT count(*) as clients, STR_TO_DATE(Appt_date, \'%m/%d/%Y\')
$sql = 'SELECT
count(*) as clients,
STR_TO_DATE(Appt_date, \'%m/%d/%Y\') AS date,
SUM(wait_time) as total_wait_time
FROM tb_by_client
WHERE status = @qualifier
GROUP BY Appt_date';
$rows = $db->fetchAll($sql);
$chartObject = new stdClass();
foreach($rows as $row){
$row->average = round($row->total_wait_time / $row->clients);
$chartObject->date = $row->date;
$chartObject->average = $row->average;
}
$chartArray[] = $chartObject;
return json_encode($chartArray);
因此,与其得到像这样的东西
[{"date":"2018-10-01","average":12},{"date":"2018-10-02","average":-33},{"date":"2018-10-04","average":23},{"date":"2018-10-05","average":6}]
我只回来一分钟
[{"date":"2018-10-01","average":12}]
因为每个循环都会覆盖最后一个键和值
如何进行附加?您的问题是覆盖数据而不保存它
$chartObject = new stdClass();
foreach($rows as $row){
$row->average = round($row->total_wait_time / $row->clients);
$chartObject->date = $row->date;
$chartObject->average = $row->average;
}
$chartArray[] = $chartObject;
请参见每次迭代foreach($row为$row){
时,您都会更改$chartObject
中的数据,但从不保存在$chartary
中
改为这样做
foreach($rows as $row){
$chartObject = new stdClass(); //new instance of stdClass, obj pass by refrence
$row->average = round($row->total_wait_time / $row->clients);
$chartObject->date = $row->date;
$chartObject->average = $row->average;
$chartArray[] = $chartObject;
}
就我个人而言,我甚至不会使用对象:
foreach($rows as $row){
$average = round($row->total_wait_time / $row->clients);
$chartArray[] = ['date'=>$row->date,'average'=>$average];
}
当您使用字符串键对数组进行JSON编码时,它将使其成为正确的Javascript对象结构。因此,实际上不需要将所有这些对象都保存在内存中,而且代码更小、更干净、更易于阅读
我在代码中暗示的最后一件事是,对象在PHP(现在)中是通过引用传递的,如果您不为每次迭代创建对象的新实例,您将实际更新对对象的所有引用。如下图所示:
$obj = new stdClass;
$objects = [];
for($i=0;$i<3;++$i){
$obj->foo = $i;
$objects[] = $obj;
print_r($objects);
}
每个数组都是for
循环的单个迭代,这是同一个数组,在每次迭代后添加另一行
正如您所见,每个副本(其实不是副本)都是通过数组中的引用进行更新的。基本上,我们已经将同一个对象(例如,将称他为Bob
)存储了3次,而不是3个单独的对象(Bob
,Alice
,John
)
如果您存储的数据是个人衬衫的颜色,当Bob
穿上红色衬衫时,他穿上了红色衬衫,但是Alice
和John
没有
因此,您需要为每次迭代创建一个新的对象实例,并存储该实例
希望这能有所帮助!你误解了什么应该在循环中,什么不应该在循环中 这应该可以:
$sql = 'SELECT
count(*) as clients,
STR_TO_DATE(Appt_date, \'%m/%d/%Y\') AS date,
SUM(wait_time) as total_wait_time
FROM tb_by_client
WHERE status = @qualifier
GROUP BY Appt_date';
$rows = $db->fetchAll($sql);
$chartArray = [];
foreach($rows as $row){
$row->average = round($row->total_wait_time / $row->clients);
$chartObject = new stdClass();
$chartObject->date = $row->date;
$chartObject->average = $row->average;
$chartArray[] = $chartObject;
}
return json_encode($chartArray);
您可以在SQL中进行数学运算,它可以完全切断循环
$sql = 'SELECT STR_TO_DATE(Appt_date, \'%m/%d/%Y\') AS date,
round(SUM(wait_time)/count(*)) as average
FROM tb_by_client
WHERE status = @qualifier
GROUP BY Appt_date';
return json_encode($db->fetchAll($sql));
$chartArray[]=$chartObject;
需要在您的循环中,$chartObject=new stdClass()
关于这件事:)我甚至没有看SQL…哈哈。比如我甚至没有注意到原来的group by在里面。因为问题是这样写的,用SQL而不是PHP来做更有意义。回答得好!你是对的,那样简单多了。我甚至没有想到从这个角度来处理它,谢谢提醒!谢谢为了澄清,尽管Nigel Ren只需编辑查询就有捷径,但我感谢您花时间告诉我哪里出了问题。谢谢!
$sql = 'SELECT STR_TO_DATE(Appt_date, \'%m/%d/%Y\') AS date,
round(SUM(wait_time)/count(*)) as average
FROM tb_by_client
WHERE status = @qualifier
GROUP BY Appt_date';
return json_encode($db->fetchAll($sql));