Проблема PHP с array_push (mainArr, subAssociativeArr) внутри функции - PullRequest
0 голосов
/ 22 марта 2019

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 ]

1 голос
/ 22 марта 2019

Когда это в функции, у вас есть другая область. Хотя параметры вашей функции addOne имеют одно и то же имя, они фактически являются копиями переданных переменных, а не ссылками на них.

Поэтому, когда вы array_push() в функции, вы воздействуете только на переменные в области действия этой функции, а не на внешнюю область.

Вы можете либо вернуть $ store, либо передать переменные по ссылке.

1 голос
/ 22 марта 2019

Вы забыли вернуть

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

Что вы, вероятно, не хотите делать, поэтому я вижу аргумент для обоих способов.Если у вас нет супер большого массива, это, вероятно, не имеет большого значения.Очень легко забыть, что случайная функция передается по ссылке.

Так что используйте любой метод, который имеет для вас больше смысла.

PS - я отказываюсь использовать array_push, это уродливо, и яне нравится :)Выполнение $store[]=$element; аналогично array_push($store,$element), за исключением того, что позволяет избежать ненужного вызова функции.

Приветствия.

0 голосов
/ 22 марта 2019

Если вы хотите, чтобы она работала внутри функции, вам нужна ссылка на переменную.Ссылка в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...