2010-03-02 12 views
6

Tengo 2 matrices.Elementos de matriz de desreferencia de PHP

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

Los elementos de Row son todas referencias y están en constante cambio. Para cada iteración de $row, deseo copiar los valores de la fila en una entrada de $result y no las referencias.

He encontrado algunas soluciones pero todas parecen bastante horribles.

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

Tanto de la obra anterior, pero parece como un montón de código innecesario y feo sólo para copiar el contenido de un conjunto de referencias de valor, en lugar de copiar las referencias mismos.

¿Hay alguna manera más clara de lograr esto? Si no, ¿cuál sería la forma más eficiente?

Gracias.

EDIT: Como se sugiere a continuación algo como:

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

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

    return $dref; 
} 

$result[] = dereference($row); 

también funciona, pero parece igual de feo.

+0

Esto podría ser un duplicado, http://stackoverflow.com/questions/1190026/php-copying-array-elements -por-valor-no-por-referencia –

+0

Él está tratando con objetos. Estoy tratando estrictamente con arreglos. – anomareh

+0

Si la gente votó mi respuesta, entonces creyeron que yo tenía razón. Si no es el caso, lo más probable es que al principio no haya aclarado su pregunta. Encuentro bastante grosero de tu parte decirle a las personas que rechacen mi intento de ayudarlo, así que no intentaré más. – zneak

Respuesta

4

No estoy seguro Entiendo totalmente la pregunta, pero ¿puedes usar la recursión?

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

parece que su función funcionaría y lo que sugerí fue incorrecto. – anomareh

2

La extensión de la función anterior LIKE resuelto un problema que tenía:

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; 
} 
Cuestiones relacionadas