【问题标题】:PHP array_merge replacing existing array valuesPHP array_merge 替换现有数组值
【发布时间】:2014-12-29 19:05:13
【问题描述】:

我在使用 PDO 从数据库中获取一些 PHP 代码时遇到问题,我想知道是否有人可以帮助我解决这个问题。我有一个从数据库中获取事件并在数组中返回结果的类。

相关部分代码为:

$seminars = array();

$sql = 'select * from seminars';
$stmt = $this->dbconn->query($sql);
$stmt->setFetchMode(PDO::FETCH_INTO, new SeminarEvent);

foreach($stmt as $seminar) {
        echo "<p>Seminar Row: ".var_dump($seminar)."</p>"; // Prints the unique row
        $seminars[] = $seminar;
        echo "<p>";var_dump($seminars);echo "</p>"; // Debug
}

(SeminarEvent 是我编写的一个类,其中包含带有 getter 和 setter 的相关字段,这些字段已包含在标题中)

我在 php.net 上的文档中读到 $array[] = $elem 和 array_push($array, $elem) 都将 $elem 添加到数组的末尾,所以我尝试使用两者和我得到了相同的结果:

对我来说是个问题的部分是向数组添加 $seminar 是替换整个数组中的所有值。使用 array_merge 时也会发生这种情况。 var_dump 的输出显示数组大小增加了 1(如预期的那样),但是每次我向数组中添加一个项目时,所有值都被新插入的项目替换。我已经在另一台服务器上尝试过这段代码,我得到了完全相同的结果。

我在这里遗漏了一些简单的东西吗?

编辑: 我添加了一个额外的行以从 foreach 循环中打印出当前的 $seminar 并且每次输出都不同,因此 $seminar 正确地引用了语句中的每一行但是 $seminars 数组仅包含添加到的最后一项数组。

【问题讨论】:

    标签: php arrays pdo


    【解决方案1】:

    我认为这是因为 SeminarEvent 创建了一次并被指针使用,所以每次填充相同的对象并且每次将相同的链接保存到数组。所以这里一种可能的解决方案是写$seminars[] = clone $seminar;而不是$seminars[] = $seminar;

    【讨论】:

    • 我很困惑,因为代码直到最近才可以工作,但按照您的建议添加克隆已经解决了这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2019-08-28
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多