2010-03-02 5 views
6

У меня есть 2 массива.Элементы массива разыменования PHP

$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); 

Также работает, но кажется столь же некрасиво.

+0

Это может быть дубликатом, http://stackoverflow.com/questions/1190026/php-copying-array-elements -by-value-not-by-reference –

+0

Он имеет дело с объектами. Я имею дело с массивами. – anomareh

+0

Если люди поддержали мой ответ, они поверили, что я прав. Если это не так, то это, скорее всего, означает, что вы сначала не задали свой вопрос. Я нахожу довольно грубым с вашей стороны, чтобы рассказать людям о снижении моей попытки помочь вам, поэтому я больше не буду пытаться. – zneak

ответ

4

Не уверен, что я полностью понимаю вопрос, но можете ли вы использовать рекурсию?

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); 
+0

кажется, что ваша функция действительно работает, и я предположил, что это неверно. – anomareh

2

Расширение функции выше нравится следующим образом решить проблему, которую я имел:

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; 
} 
Смежные вопросы