У меня есть 2 массива.
$result = array(); $row = array();
Элементы Row являются ссылками и постоянно меняются. Для каждой итерации $row
я хочу скопировать значения строки в запись $result
а не ссылки.
Я нашел несколько решений, но все они кажутся довольно ужасными.
$result[] = unserialize(serialize($row)); $result[] = array_flip(array_flip($row));
Оба вышеизложенного работают, но кажутся очень ненужным и уродливым кодом, чтобы просто скопировать содержимое массива ссылок по значению, а не копировать сами ссылки.
Есть ли более чистый способ сделать это? Если бы не самый эффективный способ?
Благодарю.
EDIT: Как было предложено ниже, например:
function dereference($ref) { $dref = array(); foreach ($ref as $key => $value) { $dref[$key] = $value; } return $dref; } $result[] = dereference($row);
Также работает, но кажется столь же уродливым.
Не уверен, что я полностью понимаю вопрос, но вы можете использовать рекурсию?
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);
Расширение функции выше, как следует, решена проблема, которую я имел:
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; }