Saltar al contenido

¿Existe una función para hacer una copia de un PHP? array ¿a otro?

Marcos, miembro de este gran equipo, nos ha hecho el favor de crear este enunciado ya que conoce perfectamente el tema.

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:

$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 ArrayObjectque es un objeto que actúa exactamente como un array. Sin embargo, al ser un objeto, tiene una 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 exactamente iguales. Si tu array contiene referencias, entonces mientras el array se pasa por copia, las referencias aún se resolverán en el destino original. Por supuesto, ese suele ser el comportamiento deseado, pero pensé que valía la pena mencionarlo.

PHP copiará el array por defecto. Las referencias en PHP tienen que 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 tienes un array que contiene objetos, necesita hacer una copia de eso array sin tocar su puntero interno, y necesita que se clonen todos los objetos (para que no esté modificando los originales cuando realiza cambios en los copiados). array), utilizar este.

El truco para no tocar el arrayEl puntero interno de es asegurarse de que está trabajando con una copia del arrayy no el original array (o una referencia a él), por lo que usar un parámetro de función hará el trabajo (por lo tanto, esta es una función que toma un array).

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

Esta función funciona para cualquier tipo de array (incluido mixed escribe).

function array_clone($array) 
    return array_map(function($element) 
        return ((is_array($element))
            ? array_clone($element)
            : ((is_object($element))
                ? clone $element
                : $element
            )
        );
    , $array);

Sección de Reseñas y Valoraciones

¡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 *