Как создать несколько массивов PHP в функции для параметров, переданных по ссылке?

Если у меня есть функция в php, которая создает несколько массивов объектов при анализе xml, как мне вернуть эти массивы в качестве ссылок?

Нужно ли мне назначать новые для выделения массивов? Как определить их внутри функции?

function ParseConfig($rawxml, &$configName, &$radioArr, &$flasherArr, &$irdArr) 

К сожалению, я имею в виду возвращение нескольких массивов в качестве ссылок на параметры.

что мне делать, чтобы создать массив внутри функции? или я могу начать использовать его как массив?

Solutions Collecting From Web of "Как создать несколько массивов PHP в функции для параметров, переданных по ссылке?"

Я не заметил, что вы отредактировали свой вопрос, что полностью изменило ситуацию. У вас есть два достойных варианта:

  1. Явно измените их в верхней части функции:

     function foo($bar, &$baz, &$qux) { $baz = $qux = array(); } 
  2. Возможно, это хорошее место для введения объекта?

     class parseConfig { protected $rawXml; protected $configName; protected $radioArr = array(); protected $flasherArr = array(); protected $irdArr = array(); public function __construct($raw_xml = null) { if (!is_null($raw_xml)) { $this->rawXml = $raw_xml; $this->parse(); } } public function parse($raw_xml = null) { if (!is_null($raw_xml)) { $this->rawXml = $raw_xml; } if (empty($this->rawXml)) { return null; } $this->configName = ''; $this->radioArr = $this->flasherArr = $this->irdArr = array(); // parsing happens here, may return false return true; } public function setRawXml($raw_xml) { $this->rawXml = $raw_xml; return $this; } public function getRawXml() { return $this->rawXml; } public function getRadioArr() { return $this->radioArr; } public function getFlasherArr() { return $this->flasherArr; } public function getIrdArr() { return $this->irdArr; } } 

В этом случае нет необходимости использовать ссылки. PHP использует механизм копирования на запись, который также отслеживает количество элементов, указывающих на текущее значение. Если вы refcount значение из функции и присвоите этот результат переменной, refcount останется только одной, так как переменная, используемая в этой функции, будет уничтожена, когда функция вернется. Вы можете безопасно редактировать переменную, содержащую значение, возвращаемое функцией, не беспокоясь о том, чтобы тратить память.

Образец теста:

 function getaz() { $array = range('a','z'); echo '2: ', memory_get_usage(), "\n"; return $array; } echo '1: ', memory_get_usage(), "\n"; $p = getaz(); echo '3: ', memory_get_usage(), "\n"; $p[0] = '3'; echo '4: ', memory_get_usage(), "\n"; $p = array_merge($p, range('A','Z')); echo '5: ', memory_get_usage(); 

Вывод:

 1: 337304 [initial] 2: 340024 [inside function, value is created] 3: 340072 [outside function, value is assigned] 4: 340072 [element modified but remains same size] 5: 342696 [array extended] 

Если я изменю функцию для возврата по ссылке, я получаю следующее:

 1: 337312 [it took 8 bytes more memory to define the function] 2: 340032 [accounting for the extra 8 bytes, no change] 3: 340080 [accounting for the extra 8 bytes, no change] 4: 340080 [accounting for the extra 8 bytes, no change] 5: 342704 [accounting for the extra 8 bytes, no change] 

Надеюсь это поможет!

Чтобы узнать больше о том, как и почему это работает, посмотрите этот бесстыдный блог-плагин, который немного объясняет, как PHP имеет дело с переменными и значениями .

return &$array;

Но это просто, чтобы просто вернуть массив $ IMHO

Любой массив, возвращаемый функцией, будет возвращен ссылкой, пока вы не измените этот массив, перед которым будет создана копия массива:

 $myArray = functionThatReturnsArray(); //$myArray is a reference to the array returned echo $myArray[0]; //still a reference $myArray[0] = 'someNewValue'; //from here $myArray will be a copy of the returned array 

Вы можете указать тип массива в списке аргументов (начиная с PHP 5.1), если вы это сделаете, вы можете сразу использовать его как массив:

 function my_function( array &$arr ) { $arr[0] = 'someValue'; } 

Если вы этого не сделаете, вы должны сделать чек в верхней части своей функции:

 function my_function( &$arr ) { if( !is_array($arr) ) $arr = array(); // or generate an error or throw exception $arr[0] = 'someValue'; }