Temos dois objetos PHP5 e gostaríamos de mesclar o conteúdo de um no segundo. Não há noção de subclasses entre elas, portanto, as soluções descritas no tópico a seguir não podem ser aplicadas.
Como você copia um objeto PHP para um 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;
Observações:
- Estes são objetos, não classes.
- Os objetos contêm muitos campos, então um foreach seria bem lento.
- Até agora, consideramos transformar os objetos A e B em matrizes e depois mesclá-los usando array_merge () antes de voltar a se transformar em um objeto, mas não podemos dizer que estamos orgulhosos disso.
Respostas:
Na verdade, isso também funciona quando os objetos têm métodos. (testado com PHP 5.3 e 5.6)
fonte
stdclass
. Embora "funcione" de certo modo em objetos com métodos, ele efetivamente arruina o objeto nesse caso (removendo os métodos).Você pode criar outro objeto que despacha chamadas para métodos mágicos para os objetos subjacentes. Aqui está como você lidaria
__get
, mas para fazê-lo funcionar completamente, você teria que substituir todos os métodos mágicos relevantes. Você provavelmente encontrará erros de sintaxe desde que eu o inseri de cabeça para baixo.Boa sorte.
fonte
fonte
$objectB
os dados mesclados são mantidos .Entendo que o uso dos objetos genéricos [stdClass ()] e a projeção deles como matrizes respondem à pergunta, mas achei que o compositor era uma ótima resposta. No entanto, achei que poderia usar alguns aprimoramentos de recursos e pode ser útil para outra pessoa.
Recursos:
Código:
Uso:
Exemplo:
fonte
foreach($objects as &$object) $this->with(&$object);
porforeach($objects as &$object) $this->with($object);
corrige o problema. Fonte: [ php.net/manual/en/language.references.pass.php]if($this->first_precedence) array_push($this->composite, &$object); else array_unshift($this->composite, &$object);
deve ser substituído porif($this->first_precedence) array_push($this->composite, $object); else array_unshift($this->composite, $object);
Uma solução muito simples, considerando que você tem o objeto A e B:
Isso é tudo. Agora você tem objA com todos os valores de objB.
fonte
A
\ArrayObject
classe tem a possibilidade de trocar a matriz atual para desconectar a referência original . Para fazer isso, ele vem com dois métodos úteis:exchangeArray()
egetArrayCopy()
. O resto é simplesarray_merge()
do objeto fornecido com asArrayObject
propriedades públicas s:O uso é tão fácil quanto isto:
fonte
merge($array)
realmente solicitasse um\ArrayObject
.uma solução Para preservar, métodos e propriedades de objetos mesclados é criar uma classe combinadora que possa
uso simples
fonte
Eu iria vincular o segundo objeto a uma propriedade do primeiro objeto. Se o segundo objeto for o resultado de uma função ou método, use referências. Ex:
fonte
Para mesclar qualquer número de objetos brutos
fonte
Aqui está uma função que achatará um objeto ou matriz. Use isso apenas se tiver certeza de que suas chaves são únicas. Se você tiver chaves com o mesmo nome, elas serão substituídas. Você precisará colocar isso em uma classe e substituir "Funções" pelo nome da sua classe. Aproveitar...
fonte
Vamos simplificar!
Se isso não responder à sua pergunta, certamente ajudará na resposta. Crédito para o código acima vai para mim :)
fonte
Esse trecho de código converterá recursivamente esses dados em um único tipo (matriz ou objeto) sem os loops foreach aninhados. Espero que ajude alguém!
Quando um Objeto estiver no formato de matriz, você poderá usar array_merge e converter novamente em Objeto, se necessário.
Maneira processual
Todo o crédito é para: Jason Oakley
fonte