Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将新数据追加到对象_Php_Json_Object - Fatal编程技术网

Php 将新数据追加到对象

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\')

我一直在尝试将新数据附加到为AMchart创建的stdClass对象

我从数据库返回我想要的所有行,然后创建一个新对象并在返回的数组中循环,但不是将我想要的附加到现有对象的末尾,它只是被覆盖。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);
因此,与其得到像这样的东西

[{"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));