У нас есть два объекта PHP5 и мы хотим объединить содержимое одного объекта со вторым. Между ними нет понятия подклассов, поэтому решения, описанные в следующем разделе, не могут применяться.
Как вы копируете объект PHP в другой тип объекта
//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;
Примечания:
- Это объекты, а не классы.
- Объекты содержат довольно много полей, поэтому foreach будет довольно медленным.
- Пока что мы рассматриваем преобразование объектов A и B в массивы, а затем объединяем их с помощью array_merge () перед повторным преобразованием в объект, но мы не можем сказать, что гордимся этим.
Ответы:
Это на самом деле также работает, когда у объектов есть методы. (протестировано с PHP 5.3 и 5.6)
источник
stdclass
. Хотя он в некотором смысле «работает» на объектах с методами, в этом случае он фактически разрушает объект (удаляя методы).Вы можете создать другой объект, который отправляет вызовы магических методов базовым объектам. Вот как бы вы справились
__get
, но чтобы заставить его работать полностью, вам нужно переопределить все соответствующие магические методы. Вы, вероятно, найдете синтаксические ошибки, так как я только что ввел его с головы до головы.Удачи.
источник
источник
$objectB
содержатся объединенные данные.Я понимаю, что использование универсальных объектов [stdClass ()] и приведение их в виде массивов отвечает на вопрос, но я подумал, что Compositor - отличный ответ. Тем не менее, я чувствовал, что он может использовать некоторые улучшения и может быть полезен для кого-то еще.
Особенности:
Код:
Использование:
Пример:
источник
foreach($objects as &$object) $this->with(&$object);
наforeach($objects as &$object) $this->with($object);
исправляет проблему. Источник: [ php.net/manual/en/language.references.pass.php]if($this->first_precedence) array_push($this->composite, &$object); else array_unshift($this->composite, &$object);
следует заменить наif($this->first_precedence) array_push($this->composite, $object); else array_unshift($this->composite, $object);
Очень простое решение, учитывая, что у вас есть объекты A и B:
Вот и все. Теперь у вас есть objA со всеми значениями из objB.
источник
\ArrayObject
Класс имеет возможность обмена текущий массив , чтобы отключить оригинальную ссылку . Для этого он поставляется с двумя удобными методами:exchangeArray()
иgetArrayCopy()
. Остальное простоarray_merge()
из предоставленного объекта сArrayObject
открытыми свойствами:Использование так же просто, как это:
источник
merge($array)
бы на самом деле запросить\ArrayObject
также.Решение Чтобы сохранить как методы, так и свойства из объединенных объектов, нужно создать класс комбинатора, который может
простое использование
источник
Я хотел бы связать второй объект со свойством первого объекта. Если второй объект является результатом функции или метода, используйте ссылки. Пример:
источник
Чтобы объединить любое количество необработанных объектов
источник
Вот функция, которая сгладит объект или массив. Используйте это, только если вы уверены, что ваши ключи уникальны. Если у вас есть ключи с одинаковым именем, они будут перезаписаны. Вам нужно будет поместить это в класс и заменить «Функции» на имя вашего класса. Наслаждаться...
источник
Давайте будем проще!
Если это не отвечает на ваш вопрос, это, безусловно, поможет к ответу. Кредит на код выше идет на себя :)
источник
Этот фрагмент кода будет рекурсивно преобразовывать эти данные в один тип (массив или объект) без вложенных циклов foreach. Надеюсь, это поможет кому-то!
Как только Объект находится в формате массива, вы можете использовать array_merge и конвертировать обратно в Object, если вам нужно.
Процессуальный путь
Весь кредит идет к: Джейсону Оукли
источник