php copying array elements by value, not by reference

前端 未结 6 2009
清歌不尽
清歌不尽 2020-12-06 05:48

I have the following code:

$data[\'x\'] = $this->x->getResults();  

$data[\'y\'] = $data[\'x\'];

//some code here to modify $data[\'y\']
//this cause         


        
6条回答
  •  孤街浪徒
    2020-12-06 06:09

    You can take advantage of the fact that PHP will dereference the results of a function call.

    Here's some example code I whipped up:

    $x = 'x';
    $y = 'y';
    $arr = array(&$x,&$y);
    print_r($arr);
    
    echo "
    "; $arr2 = $arr; $arr2[0] = 'zzz'; print_r($arr); print_r($arr2); echo "
    "; $arr2 = array_flip(array_flip($arr)); $arr2[0] = '123'; print_r($arr); print_r($arr2);

    The results look like this:

    Array ( [0] => x [1] => y )
    Array ( [0] => zzz [1] => y ) Array ( [0] => zzz [1] => y )
    Array ( [0] => zzz [1] => y ) Array ( [0] => 123 [1] => y ) 
    

    You can see that the results of using array_flip() during the assigment of $arr to $arr2 results in differences in the subsequent changes to $arr2, as the array_flip() calls forces a dereference.

    It doesn't seem terribly efficient, but it might work for you if $this->x->getResults() is returning an array:

    $data['x'] = array_flip(array_flip($this->x->getResults()));
    $data['y'] = $data['x'];
    

    See this (unanswered) thread for another example.

    If everything in your returned array is an object however, then the only way to copy an object is to use clone(), and you would have to iterate through $data['x'] and clone each element into $data['y'].

    Example:

    $data['x'] = $this->x->getResults();
    $data['y'] = array();
    foreach($data['x'] as $key => $obj) {
        $data['y'][$key] = clone $obj;
    }
    

提交回复
热议问题