我试图将新数据附加到我正在为AMchart创建的stdClass对象
我正在从DB中返回我想要的所有行,然后创建一个新对象并循环遍历返回的数组,但不是将我想要的内容附加到现有对象的末尾,它只是被覆盖.PHP对象没有append或push方法,那么你如何实现这一目标呢?
这是我的代码的样子.我错过了一些简单的事吗?
$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);
Run Code Online (Sandbox Code Playgroud)
所以不要得到看起来像这样的东西
[{"date":"2018-10-01","average":12},{"date":"2018-10-02","average":-33},{"date":"2018-10-04","average":23},{"date":"2018-10-05","average":6}]
Run Code Online (Sandbox Code Playgroud)
我回来了一个
[{"date":"2018-10-01","average":12}]
Run Code Online (Sandbox Code Playgroud)
因为每个循环都会覆盖最后一个键和值
你怎么追加?
您的问题是您在不保存数据的情况下覆盖数据
$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;
Run Code Online (Sandbox Code Playgroud)
在每次迭代中foreach($rows as $row){看到您更改数据$chartObject,但您从未保存过$chartArray.
这样做
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;
}
Run Code Online (Sandbox Code Playgroud)
就个人而言,我甚至不愿意使用一个对象:
foreach($rows as $row){
$average = round($row->total_wait_time / $row->clients);
$chartArray[] = ['date'=>$row->date,'average'=>$average];
}
Run Code Online (Sandbox Code Playgroud)
当您JSON使用字符串键对数组进行编码时,它将使其成为正确的Javascript对象结构.因此,实际上不需要将所有这些对象保留在内存中,并且代码更小,更清晰,更易于阅读.
我在代码中暗示的最后一件事是,对象在PHP(现在)中通过引用传递,如果不为每次迭代创建对象的新实例,则实际上将更新对该对象的所有引用.这可以这样说明:
$obj = new stdClass;
$objects = [];
for($i=0;$i<3;++$i){
$obj->foo = $i;
$objects[] = $obj;
print_r($objects);
}
Run Code Online (Sandbox Code Playgroud)
输出:
Array
(
[0] => stdClass Object
(
[foo] => 0
)
)
Array
(
[0] => stdClass Object
(
[foo] => 1
)
[1] => stdClass Object
(
[foo] => 1
)
)
Array
(
[0] => stdClass Object
(
[foo] => 2
)
[1] => stdClass Object
(
[foo] => 2
)
[2] => stdClass Object
(
[foo] => 2
)
)
Run Code Online (Sandbox Code Playgroud)
每个数组都是for循环的单个迭代,这是在每次迭代后添加另一行的相同数组.
正如您所看到的,每个副本(它不是真正的副本)都是通过数组中的引用进行更新的.基本上,我们已经存储了相同的对象(例如,将称呼他Bob)的3倍,而不是3个独立的对象(Bob,Alice,John).
如果存储的数据是一个人的衬衫,在颜色Bob上红色球衣看跌期权,他有一个红色的衬衫,但Alice并John没有.
因此,您需要为每次迭代创建一个新的对象实例并存储它.
希望有所帮助!