【问题标题】:update a global array within a function更新函数内的全局数组
【发布时间】:2016-12-24 12:11:33
【问题描述】:

我有一个全局数组,我试图在其中更新一个值(保持持久性)然后显示它。
我没有收到错误,但数组永远不会更新。

<?php
$anchor = 'bird';
$stuff = array('apple', 'bird', 'frog');

function insert($anchor, $stuff){
    foreach($stuff as $part){
        $new_array = array($anchor => rand());
        if($part == $anchor){
            array_push($stuff, $new_array);
        }
    }
}

for($x = 0; $x < 2; $x++){
    insert($anchor, $stuff);
    var_dump($stuff);
}

输出:

array(3) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(4) "bird"
  [2]=>
  string(4) "frog"
}
array(3) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(4) "bird"
  [2]=>
  string(4) "frog"
}

预期输出:

{'鸟' => 674568765}
{'鸟' => 986266261}

如何更新函数内的数组,以便全局反映更改(持久)?

【问题讨论】:

  • PHP 变量是按值而不是通过引用传递给函数的。 stackoverflow.com/questions/879/…
  • 要更新原始数组,您需要从函数返回一个值并将其分配给数组变量。

标签: php arrays function


【解决方案1】:

正如其他人提到的:默认情况下,PHP function arguments 是按值传递的,这意味着函数内部更改的值不会在函数外部更改。

我建议 returning 从您的函数中使用新的 $stuff 值:

<?php

$anchor = 'bird';
$stuff = array('apple', 'bird', 'frog');

function insert($anchor, $stuff){
  foreach($stuff as $part){
    $new_array = array($anchor => rand());
    if($part == $anchor){
      array_push($stuff, $new_array);
    }
  }
  return $stuff;
}

for($x = 0; $x < 2; $x++){
  $stuff=insert($anchor, $stuff);
}

echo"<pre>".print_r($stuff,true)."</pre>";

?>
Array
(
    [0] => apple
    [1] => bird
    [2] => frog
    [3] => Array
        (
            [bird] => 618490127
        )

    [4] => Array
        (
            [bird] => 1869073273
        )

)

其他解决方案建议passing by reference,我不反对。但是我确实遇到了错误的代码,其中并不能立即清楚地知道一个函数正在改变一个值,而且我被unexpected loop behavior 弄糊涂了。因此,我通常更喜欢返回新值的更具可读性/可维护性的代码。

When to pass-by-reference in PHP
Get technical with Sara Golemon

【讨论】:

  • 我相信这比使用引用参数声明函数更安全。
  • @JonathanM 他们实际上几乎是一样的。没有一个比另一个“更安全”。使用不存在的参考来制作副本没有任何漏洞或问题。通过引用实际上不会复制数组,如果您要处理大量数据,这会更好。
  • 在API方面,我认为函数返回改变的值比通过引用改变它们更好。这样,程序员就不会在不知不觉中得到改变的值。出错的可能性较小。
【解决方案2】:

如果您希望对传递给函数的变量的更改在函数结束后保持不变,请通过引用传递变量:

变化:

function insert($anchor, $stuff)

function insert($anchor, &$stuff)

【讨论】:

    【解决方案3】:

    通过引用传递变量$stuff。注意函数参数中的&amp;

    function insert($anchor, &$stuff){    // note the & mark
            foreach($stuff as $part){
                    $new_array = array($anchor => rand());
                    if($part == $anchor){
                            array_push($stuff, $new_array);
                    }
            }
    }
    

    【讨论】:

    • 它说我必须等待 6 分钟才能点击。
    • 你有关于我为什么需要一个指针的详细信息的文档吗?这让我大吃一惊(我假设这是一个指针,我从未在 PHP 上玩过)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2018-04-30
    • 2019-12-03
    相关资源
    最近更新 更多