Какой лучший способ объединить два объекта PHP? - PullRequest
208 голосов
/ 18 января 2009

У нас есть два объекта 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 () перед повторным преобразованием в объект, но мы не можем сказать, что гордимся этим.

Ответы [ 13 ]

0 голосов
/ 13 октября 2018

Этот фрагмент кода будет рекурсивно преобразовывать эти данные в один тип (массив или объект) без вложенных циклов foreach. Надеюсь, это кому-нибудь поможет!

Как только Объект находится в формате массива, вы можете использовать array_merge и конвертировать обратно в Объект, если вам нужно.

abstract class Util {
    public static function object_to_array($d) {
        if (is_object($d))
            $d = get_object_vars($d);

        return is_array($d) ? array_map(__METHOD__, $d) : $d;
    }

    public static function array_to_object($d) {
        return is_array($d) ? (object) array_map(__METHOD__, $d) : $d;
    }
}

Процессуальный путь

function object_to_array($d) {
    if (is_object($d))
        $d = get_object_vars($d);

    return is_array($d) ? array_map(__FUNCTION__, $d) : $d;
}

function array_to_object($d) {
    return is_array($d) ? (object) array_map(__FUNCTION__, $d) : $d;
}

Вся заслуга: Джейсон Оукли

0 голосов
/ 03 сентября 2014

Давайте будем проще!

function copy_properties($from, $to, $fields = null) {
    // copies properties/elements (overwrites duplicates)
    // can take arrays or objects 
    // if fields is set (an array), will only copy keys listed in that array
    // returns $to with the added/replaced properties/keys
    $from_array = is_array($from) ? $from : get_object_vars($from);
    foreach($from_array as $key => $val) {
        if(!is_array($fields) or in_array($key, $fields)) {
            if(is_object($to)) {
                $to->$key = $val;
            } else {
                $to[$key] = $val;
            }
        }
    }
    return($to);
}

Если это не ответит на ваш вопрос, это наверняка поможет к ответу. Кредит на код выше идет на себя:)

0 голосов
/ 15 мая 2009

Вот функция, которая сгладит объект или массив. Используйте это, только если вы уверены, что ваши ключи уникальны. Если у вас есть ключи с одинаковым именем, они будут перезаписаны. Вам нужно будет поместить это в класс и заменить «Функции» на имя вашего класса. Наслаждайтесь ...

function flatten($array, $preserve_keys=1, &$out = array(), $isobject=0) {
        # Flatten a multidimensional array to one dimension, optionally preserving keys.
        #
        # $array - the array to flatten
        # $preserve_keys - 0 (default) to not preserve keys, 1 to preserve string keys only, 2 to preserve all keys
        # $out - internal use argument for recursion
        # $isobject - is internally set in order to remember if we're using an object or array
        if(is_array($array) || $isobject==1)
        foreach($array as $key => $child)
            if(is_array($child))
                $out = Functions::flatten($child, $preserve_keys, $out, 1); // replace "Functions" with the name of your class
            elseif($preserve_keys + is_string($key) > 1)
                $out[$key] = $child;
            else
                $out[] = $child;

        if(is_object($array) || $isobject==2)
        if(!is_object($out)){$out = new stdClass();}
        foreach($array as $key => $child)
            if(is_object($child))
                $out = Functions::flatten($child, $preserve_keys, $out, 2); // replace "Functions" with the name of your class
            elseif($preserve_keys + is_string($key) > 1)
                $out->$key = $child;
            else
                $out = $child;

        return $out;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...