更新函数

时间:2016-08-17 17:56:31

标签: php arrays function

我有一个全局数组,我正在尝试更新一个值(保持持久性),然后显示它 我没有得到任何错误,但数组永远不会更新。

<?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"
}

预期产出:

  

{'bird'=&gt; 674568765}
  {'bird'=&gt; 986266261}

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

3 个答案:

答案 0 :(得分:2)

通过引用传递变量Angular Material autocomplete。请注意函数参数中的$stuff

&

答案 1 :(得分:2)

正如其他人所提到的:默认情况下,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

答案 2 :(得分:1)

如果要在函数结束后更改传递给函数的变量,请通过引用传递变量:

变化:

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

function insert($anchor, $stuff)