php - foreach 循环后数组被覆盖

标签 php arrays foreach overwrite

我正在尝试将包含元素的对象从 sql 结果集中推送到数组中。我的代码是这样的:

$data = array();
$sql = "SELECT id,type,name,username FROM users";
foreach ($conn->query($sql) as $row) { 
    $this->set_id($row['id']);
    $this->set_type($row['type']);
    $this->set_username($row['username']);
    $this->set_password($row['password']);

    $data[] = $this;
}

我的结果集是正确的,但在 foreach 循环结束后,我的数组单元格被最后一个记录集中的值覆盖。例如,如果我有这些结果 {1,'type1','user','pass'}, {2,'type2','foo','bar'},当我在循环外打印我的 $data 数组时,我只得到第二个结果集重复了两次。我做错了什么?

最佳答案

在实例方法中,$this 总是引用当前的类实例;在每次循环迭代中,您修改实例本身,然后将其添加到 $data;但在赋值时并没有创建副本,而是添加了对同一实例的引用。

最后你有一个数组,每个索引处都有相同的对象。

您需要在每次循环迭代时创建您所在类的新实例:

foreach ($conn->query($sql) as $row) { 
    $obj = new self; // create new instance of ourselves

    $obj->set_id($row['id']);
    $obj->set_type($row['type']);
    $obj->set_username($row['username']);
    $obj->set_password($row['password']);

    $data[] = $obj;
}

这是个人建议,但我要么将这段代码移到静态方法中,要么完全移到一个单独的类中。

关于php - foreach 循环后数组被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15131847/

相关文章:

php - 如何将 id 数组插入数据库 MySQL?

php - 更改具有相同 ID joomla 的模块标题之一的 ID

javascript - 有没有办法在javascript中复制对象数组?

php - 从 VALUES NOT EQUALS = array 的数据库中选择

php - 根据变量创建多个div

php - 在 WHM/cPanel 服务器上通过 PHP 以编程方式创建数据库

php - 从数据库中选择前 20 个结果,并可以选择查看更多结果

php - 存储多维数组中的特定值

c++ - 对使用从 C++ 文件中读取的值有帮助吗?

jsf - Primefaces dataScroller 具有子组件的动态 id