函数内有array_push(mainArr,subAssociativeArr)的PHP问题

时间:2019-03-21 22:18:21

标签: php function multidimensional-array associative-array array-push

array_push(mainArr,subAssociativeArr)在函数内部时不起作用。我需要一些有关此代码的帮助:

$store=array();
$samsung=array('id'=>'10','name'=>'samsung');
$sony=array('id'=>'11','name'=>'sony');

function addOne($store, $element){
    array_push($store, $element);
}
addOne($store, $samsung);

var_dump($store); //output: empty array 

但是,如果没有功能,它将正常工作;类似于以下内容:

$store=array();
$samsung=array('id'=>'10','name'=>'samsung');
$sony=array('id'=>'11','name'=>'sony');
array_push($store, $samsung);
var_dump($store); //output: array is added 

那么,出什么问题了?

3 个答案:

答案 0 :(得分:1)

您忘了回来

function addOne($store, $element){
    $store[]=$element;
    return $store;
}
$store = addOne($store, $samsung);

如果您愿意(也可以与您的代码更加一致),也可以通过引用传递该信息:

function addOne(&$store, $element){
    $store[]=$element;
}
addOne($store, $samsung);

请注意&。而不是复制输入,它更像是指向原始变量的指针,因此您可以直接更新它。在这里,以太方式还不错,这实际上是开发人员选择的问题。例如,将两者混合很容易:

//Don't do this
function addOne(&$store, $element){ //returns null
    $store[]=$element;
}
$store = addOne($store, $samsung); //sets $store to null

您可能不想这样做,所以我可以看到两种方法的论点。除非您拥有超大型阵列,否则可能没什么大不了的。很容易忘记随机函数是通过引用传递的。

因此,请使用对您更有意义的任何方法。

P.S。 -我拒绝使用array_push,这很丑陋,我不喜欢:)。进行$store[]=$element;array_push($store,$element)相同,只是这样做可以避免不必要的函数调用。

干杯。

答案 1 :(得分:1)

当它在函数中时,您具有不同的作用域。尽管addOne函数的参数具有相同的名称,但它们实际上是传递的变量的副本,而不是对其的引用。

因此,当您array_push()使用某个函数时,只会影响该函数作用域内的变量,而不会影响外部作用域。

您可以返回$ store,也可以通过引用传递变量。

答案 2 :(得分:0)

如果希望它在函数中运行,则需要引用该变量。 PHP中的引用定义为&,它们类似于C或C ++中的“指针”。

尝试一下:

function addOne(&$store, $element){
    array_push($store, $element);
}

addOne($store, $samsung);
  

PHP引用是一个别名,它允许两个不同的变量写入相同的值。从PHP 5开始,对象变量不再包含对象本身作为值。它仅包含一个对象标识符,该标识符使对象访问者可以找到实际的对象。当对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们持有标识符的副本,该副本指向同一对象。

http://www.php.net/manual/en/language.oop5.references.php