将新数据附加到对象

Che*_*ell 0 php json object

我试图将新数据附加到我正在为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)

因为每个循环都会覆盖最后一个键和值

你怎么追加?

Art*_*nix 5

您的问题是您在不保存数据的情况下覆盖数据

$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)

的SANbox

每个数组都是for循环的单个迭代,这是在每次迭代后添加另一行的相同数组.

正如您所看到的,每个副本(它不是真正的副本)都是通过数组中的引用进行更新的.基本上,我们已经存储了相同的对象(例如,将称呼他Bob)的3倍,而不是3个独立的对象(Bob,Alice,John).

如果存储的数据是一个人的衬衫,在颜色Bob上红色球衣看跌期权,他有一个红色的衬衫,但AliceJohn没有.

因此,您需要为每次迭代创建一个新的对象实例并存储它.

希望有所帮助!