Tenemos dos objetos PHP5 y nos gustaría fusionar el contenido de uno en el segundo. No existe una noción de subclases entre ellos, por lo que las soluciones descritas en el siguiente tema no pueden aplicarse.
¿Cómo se copia un objeto PHP en un tipo de objeto diferente?
//We have this:
$objectA->a;
$objectA->b;
$objectB->c;
$objectB->d;
//We want the easiest way to get:
$objectC->a;
$objectC->b;
$objectC->c;
$objectC->d;
Observaciones:
- Estos son objetos, no clases.
- Los objetos contienen muchos campos, por lo que un foreach sería bastante lento.
- Hasta ahora consideramos transformar los objetos A y B en matrices y luego fusionarlos usando array_merge () antes de volver a transformarlos en un objeto, pero no podemos decir que estamos orgullosos de esto.
Respuestas:
En realidad, esto también funciona cuando los objetos tienen métodos. (probado con PHP 5.3 y 5.6)
fuente
stdclass
. Si bien en cierto sentido "funciona" en objetos con métodos, efectivamente arruina el objeto en ese caso (al eliminar los métodos).Podría crear otro objeto que despache llamadas a métodos mágicos a los objetos subyacentes. Así es como lo manejarías
__get
, pero para que funcione completamente, tendrás que anular todos los métodos mágicos relevantes. Probablemente encontrará errores de sintaxis ya que lo acabo de ingresar en la parte superior de mi cabeza.Buena suerte.
fuente
fuente
$objectB
contiene los datos combinados.Entiendo que usar los objetos genéricos [stdClass ()] y convertirlos como matrices responde la pregunta, pero pensé que el Compositor fue una gran respuesta. Sin embargo, sentí que podría usar algunas mejoras de funciones y podría ser útil para otra persona.
caracteristicas:
Código:
Uso:
Ejemplo:
fuente
foreach($objects as &$object) $this->with(&$object);
conforeach($objects as &$object) $this->with($object);
corrige el problema. Fuente: [ php.net/manual/en/language.references.pass.php]if($this->first_precedence) array_push($this->composite, &$object); else array_unshift($this->composite, &$object);
debe reemplazarse conif($this->first_precedence) array_push($this->composite, $object); else array_unshift($this->composite, $object);
Una solución muy simple teniendo en cuenta que tiene el objeto A y B:
Eso es todo. Ahora tiene objA con todos los valores de objB.
fuente
La
\ArrayObject
clase tiene la posibilidad de intercambiar la matriz actual para desconectar la referencia original . Para hacerlo, viene con dos métodos útiles:exchangeArray()
ygetArrayCopy()
. El resto es simplearray_merge()
del objeto proporcionado con lasArrayObject
propiedades públicas de s:El uso es tan fácil como esto:
fuente
merge($array)
realmente solicitara\ArrayObject
también.una solución Para preservar, tanto los métodos como las propiedades de los proyectos combinados es crear una clase de combinador que pueda
uso simple
fuente
Me gustaría vincular el segundo objeto a una propiedad del primer objeto. Si el segundo objeto es el resultado de una función o método, use referencias. Ex:
fuente
Para fusionar cualquier cantidad de objetos sin procesar
fuente
Aquí hay una función que aplanará un objeto o matriz. Use esto solo si está seguro de que sus claves son únicas. Si tiene claves con el mismo nombre, se sobrescribirán. Deberá colocar esto en una clase y reemplazar "Funciones" con el nombre de su clase. Disfrutar...
fuente
¡Hagámoslo simple!
Si eso no responde a su pregunta, seguramente ayudará con la respuesta. El crédito por el código anterior va para mí :)
fuente
Este fragmento de código convertirá recursivamente esos datos a un solo tipo (matriz u objeto) sin los bucles foreach anidados. Espero que ayude a alguien!
Una vez que un Objeto está en formato de matriz, puede usar array_merge y convertirlo nuevamente a Objeto si es necesario.
Forma procesal
Todo el crédito va a: Jason Oakley
fuente