Search code examples
phparraysreferencedereference

PHP dereference array elements


I have 2 arrays.

$result = array();
$row = array();

Row's elements are all references and is constantly changing. For each iteration of $row I want to copy the values of row into an entry of $result and not the references.

I have found a few solutions but they all seem rather awful.

$result[] = unserialize(serialize($row));
$result[] = array_flip(array_flip($row));

Both of the above work but seem like a lot of unnecessary and ugly code just to copy the contents of an array of references by value, instead of copying the references themselves.

Is there a cleaner way to accomplish this? If not what would the most efficient way be?

Thanks.

EDIT: As suggested below something such as:

function dereference($ref) {
    $dref = array();

    foreach ($ref as $key => $value) {
        $dref[$key] = $value;
    }

    return $dref;
}

$result[] = dereference($row);

Also works but seems equally as ugly.


Solution

  • Not sure I totally understand the question, but can you use recursion?

    function array_copy($source) {
        $arr = array();
    
        foreach ($source as $element) {
            if (is_array($element)) {
                $arr[] = array_copy($element);
            } else {
                $arr[] = $element;
            }
        }
    
        return $arr;
    }
    
    $result = array();
    $row = array(
        array('a', 'b', 'c'),
        array('d', 'e', 'f')
    );
    
    $result[] = array_copy($row);
    
    $row[0][1] = 'x';
    
    var_dump($result);
    var_dump($row);