【问题标题】:php array pass by reference - assigning a duplicate value for the key gets discardedphp数组按引用传递-为键分配重复值被丢弃
【发布时间】:2010-08-16 10:42:05
【问题描述】:

我正在发送一个最初为空的数组变量的引用。 在被调用的函数中,数组被填充。

function one()
{
     $ret = array();
     two($ret);

      pri nt_r($ret);
}

function two(&$res)
{
     foreach($a as $b)
     {
       $id = $b->getid();
       $txt = $b->gettxt();

       $res[$id] = $txt;
      }
}

在这里,如果 $id 重复,我假设它被默认覆盖。 也就是说,如果 foreach 运行 5 次,如果 id=5 运行 3 次,则结果只有数组中的两个元素;

这是这种数组分配的默认行为吗? 还是我错过了什么?


是的,它正在用最后一个值覆盖重复项。我单独进行了测试,结果恰好是假设的。但是如果我们使用 array_push 我希望它会被复制。我认为直接分配重复项将被复制而不是覆盖。无论如何,让我从用户那里得到一些 cmets,这样如果我错过了一些关于这个复制和覆盖的有用信息,我可以更新。

【问题讨论】:

标签: php arrays function


【解决方案1】:

来自PHP Manual on Arrays:

PHP 中的数组实际上是一个有序映射。映射是将值与键相关联的类型。这种类型针对几种不同的用途进行了优化;它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。由于数组值可以是其他数组,因此树和多维数组也是可能的。

进一步

键可以是整数或字符串。如果键是整数的标准表示,它将被解释为这样(即“8”将被解释为 8,而“08”将被解释为“08”)

对你的问题最重要

如果没有为值指定键,则取整数索引中的最大值,新键将是该值加 1。如果指定了已分配值的键,则该值将被覆盖。

【讨论】:

    【解决方案2】:

    我不明白您为什么要通过引用来谈论数组,或者您的示例中的 $a 是什么,但简单的答案是肯定的,它们被覆盖了。

    $a = array();
    $b = 'someText'; // or $b = 25;
    $a[$b] = 1;
    $a[$b] = 2;
    

    那么 $a[$b] 将是 2,无论 $b 是什么,无论 $a 来自哪里。

    【讨论】:

    • 好的,谢谢。这是我第一次尝试这样的代码,所以我想从专家那里得到 cmets。我也经过测试,它正在覆盖。
    • 我必须放弃这篇文章,因为主题不相关。我不应该在这里添加引用这个词。
    猜你喜欢
    • 2011-05-29
    • 2015-07-11
    • 2012-06-03
    • 2013-12-02
    • 2019-05-07
    • 2012-03-12
    • 2013-09-15
    • 2023-03-07
    • 2016-09-12
    相关资源
    最近更新 更多