如何在函数中为引用传递的参数创建多个PHP数组?

时间:2011-09-13 19:29:26

标签: php arrays reference

如果我在php中有一个函数从解析xml创建几个对象数组,我该如何将这些数组作为引用返回?

我是否需要调用new来分配数组?如何在函数中定义它们?

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

抱歉,我的意思是返回多个数组作为参数引用。

如何在函数内部创建数组?或者我可以开始将其用作数组吗?

5 个答案:

答案 0 :(得分:2)

在这种情况下无需使用引用。 PHP使用写入机制上的副本,该机制还跟踪指向当前值的项目数。如果从函数返回一个值,并将该结果赋给变量,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]

希望这有帮助!

如需了解更多关于如何以及为何如此运作的信息,请查看this shameless blog plug that explains a little bit about how PHP deals with variables and values

答案 1 :(得分:1)

return &$array;

但是只返回$ array恕我直言

答案 2 :(得分:0)

从函数返回的任何数组都将通过引用返回,直到您修改该数组之前的数组:

$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

答案 3 :(得分:0)

您可以在参数列表中指定数组类型(自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';
}

答案 4 :(得分:0)

我没有注意到你编辑了你的问题,这完全改变了一些事情。你有两个不错的选择:

  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;
        }
    }