6

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.

3
  • This might be a duplicate, stackoverflow.com/questions/1190026/… Commented Mar 2, 2010 at 0:31
  • He is dealing with objects. I am dealing strictly with arrays. Commented Mar 2, 2010 at 1:19
  • What do you mean by "copy"? Which kind of "references" are you talking about that should be avoided? Commented Apr 30, 2020 at 15:40

3 Answers 3

4

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);
Sign up to request clarification or add additional context in comments.

1 Comment

it appears as though your function would indeed work and what I suggested was incorrect.
2

Extending the function above like follows solved a problem I had:

function array_copy($source) {
    $arr = array();

    foreach ($source as $element) {
        if (is_array($element)) {
            $arr[] = array_copy($element);
        } elseif (is_object($element)) {
            // make an object copy
            $arr[] = clone $element;
        } else {
            $arr[] = $element;
        }
    }
    return $arr;
}

Comments

-1
$result = array_map(function($_){return $_;}, $row);

2 Comments

Hello DonJaime, welcome to StackOverflow. :-) You seem to have posted a nice answer here. Yet, instead of just posting code as an answer, please add an explanation to your solution, so the readers can also understand why it works.
How is this different from $result = $row?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.