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

Posted

技术标签:

【中文标题】追加到数组替换数组中的所有元素【英文标题】:Appending to array replaces all elements in the array 【发布时间】:2015-03-27 22:11:32 【问题描述】:

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

$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[]) 确实被添加到循环的每次迭代中;但是,除了追加表的每一行之外,所有元素都会被最后追加的结果替换。所以我有一个数组,其元素数量与表中的行数相同,但元素都是相同的。

任何想法都将不胜感激。

示例:

    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
        
  )

【问题讨论】:

【参考方案1】:

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

你必须按值而不是按引用来复制:

$ret[] = clone $site;

见http://php.net/manual/en/language.oop5.cloning.php

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

【讨论】:

如我所见,获取数组对您来说没问题,所以只是为了记录,为什么克隆可能会失败:***.com/questions/4959949/clone-is-not-working-for-me【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于追加到数组替换数组中的所有元素的主要内容,如果未能解决你的问题,请参考以下文章

将给定数组中的所有零移动到末尾,并将每个非零元素替换为最接近的较大值(如果有)

shell脚本中的数组常见使用方式

APL:数组的元素替换和乘法

python追加到json对象中的数组

labview如何对数组中的任意一个元素进行替换

在 swift 3 中使用 .append() 时,数组中的元素被替换,而不是数组获得新元素