追加到数组会替换数组中的所有元素

时间:2015-01-28 20:36:41

标签: php arrays replace append

我正在使用下面的代码从数据库构建一个行数组。

$site = new stdClass();    
$dbh = _vic_commander_db();
    $sth = $dbh->prepare('SELECT name, title, url FROM site ORDER BY siteid');
    $sth->bindColumn(1, $site->name);
    $sth->bindColumn(2, $site->title);
    $sth->bindColumn(4, $site->url);

    $sth->execute();
    $ret = array();
    while ($sth->fetch(PDO::FETCH_BOUND))
    {
        $ret[] = $site;
    }

数组($ ret [])确实被添加到循环的每次迭代中;但是除了APPENDING表的每一行之外,所有元素都会通过附加的最后一个结果获得REPLACED。所以我有一个数组,其元素数与表中的行数相同,但元素都是相同的。

非常感谢任何想法。

示例:

    array(3) (
      [0] => stdClass object {
        name => (string) Same Site Name
        title => (string) Same Site Title
        url => (string) samepurl.com
      }
      [1] => stdClass object {
        name => (string) Same Site Name
        title => (string) Same Site Title
        url => (string) samepurl.com
      }
      [2] => stdClass object {
        name => (string) Same Site Name
        title => (string) Same Site Title
        url => (string) samepurl.com
        }
  )

3 个答案:

答案 0 :(得分:3)

所有数组索引都指向同一个对象$site

您必须按值而非参考文件进行复制:

$ret[] = clone $site;

请参阅http://php.net/manual/en/language.oop5.cloning.php

我也想知道为什么你真的需要在这里存储一个对象。

答案 1 :(得分:1)

另一个答案有一个不错的解释,但为什么不只是获取一个对象数组?

$sth = $dbh->prepare('SELECT name, title, url FROM site ORDER BY siteid');
$ret = $sth->fetchAll(PDO::FETCH_OBJ);

答案 2 :(得分:0)

根据文档(execute()之前的bindColumn())尝试这种方式:

$site = new stdClass();    
$dbh = _vic_commander_db();
    $sth = $dbh->prepare('SELECT name, title, url FROM site ORDER BY siteid');
    $sth->execute();

    $sth->bindColumn(1, $site->name);
    $sth->bindColumn(2, $site->title);
    $sth->bindColumn(4, $site->url); //could you explain why 4?? not 3 ???

    $ret = array();
    while ($sth->fetch(PDO::FETCH_BOUND))
    {
        $ret[] = $site;
    }