Saltar al contenido

¿Existe una función para hacer una copia de una matriz PHP a otra?

Solución:

En PHP, las matrices se asignan por copia, mientras que los objetos se asignan por referencia. Esto significa que:

$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);

Rendirá:

array(0) {
}

Mientras que:

$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);

Rendimientos:

object(stdClass)#1 (1) {
  ["foo"]=>
  int(42)
}

Podría confundirse con complejidades como ArrayObject, que es un objeto que actúa exactamente como una matriz. Sin embargo, al ser un objeto, tiene semántica de referencia.

Editar: @AndrewLarsson plantea un punto en los comentarios a continuación. PHP tiene una característica especial llamada “referencias”. Son algo similares a los punteros en lenguajes como C / C ++, pero no lo mismo. Si su matriz contiene referencias, mientras la matriz en sí se pasa por copia, las referencias aún se resolverán en el objetivo original. Por supuesto, ese suele ser el comportamiento deseado, pero pensé que valía la pena mencionarlo.

PHP copiará la matriz por defecto. Las referencias en PHP deben ser explícitas.

$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a

Si tiene una matriz que contiene objetos, necesita hacer una copia de esa matriz sin tocar su puntero interno, y necesita clonar todos los objetos (de modo que no esté modificando los originales cuando realice cambios en la copia array), usa esto.

El truco para no tocar el puntero interno de la matriz es asegurarse de que está trabajando con una copia de la matriz, y no con la matriz original (o una referencia a ella), por lo que el uso de un parámetro de función hará el trabajo (por lo tanto, esta es una función que toma una matriz).

Tenga en cuenta que aún necesitará implementar __clone () en sus objetos si desea que sus propiedades también sean clonadas.

Esta función funciona para cualquier tipo de matriz (incluido el tipo mixto).

function array_clone($array) {
    return array_map(function($element) {
        return ((is_array($element))
            ? array_clone($element)
            : ((is_object($element))
                ? clone $element
                : $element
            )
        );
    }, $array);
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *