Подтвердить что ты не робот

Инициализировать объекты как массивы в PHP?

В PHP вы можете быстро инициализировать массивы со значениями, используя следующие обозначения:

$array = array("name" => "member 1", array("name" => "member 1.1") ) ....

Есть ли способ сделать это для объектов STDClass? Я не знаю более короткого пути, чем тоскливый

$object = new STDClass();
$object->member1 = "hello, I'm 1";
$object->member1->member1 = "hello, I'm 1.1";
$object->member2 = "hello, I'm 2";
4b9b3361

Ответ 1

Из сообщения, показывающего листинг типов и использование рекурсивной функции для преобразования одиночных и многомерных массивов в стандартный объект:

<?php
function arrayToObject($array) {
    if (!is_array($array)) {
        return $array;
    }

    $object = new stdClass();
    if (is_array($array) && count($array) > 0) {
        foreach ($array as $name=>$value) {
            $name = strtolower(trim($name));
            if (!empty($name)) {
                $object->$name = arrayToObject($value);
            }
        }
        return $object;
    }
    else {
        return FALSE;
    }
}

По существу вы создаете функцию, которая принимает $array и выполняет итерацию по всем ее ключам и значениям. Он присваивает значения свойствам класса с помощью клавиш.

Если значение представляет собой массив, вы снова вызываете функцию (рекурсивно) и назначаете ее вывод как значение.

Примерная функция выше делает именно это; однако логика, вероятно, упорядочена немного иначе, чем вы, естественно, думаете об этом процессе.

Ответ 2

Вы можете использовать литье типов:

$object = (object) array("name" => "member 1", array("name" => "member 1.1") );

Ответ 3

Я также проголосовал за Gumbo как предпочтительное решение, но то, что он предложил, не совсем то, что было предложено, что может привести к некоторой путанице в том, почему member1o больше похож на member1a.

Чтобы убедиться, что это ясно сейчас, два способа (теперь 3 способа с 5.4) создать один и тот же stdClass в php.

  • В соответствии с вопросом длительный или ручной подход:

    $object = new stdClass;
    $object->member1 = "hello, I'm 1";
    $object->member1o = new stdClass;
    $object->member1o->member1 = "hello, I'm 1o.1";
    $object->member2 = "hello, I'm 2";
    
  • Более короткая или однострочная версия (расширенная для ясности) для создания объекта из массива, предложение ala Gumbo.

    $object = (object)array(
         'member1' => "hello, I'm 1",
         'member1o' => (object)array(
             'member1' => "hello, I'm 1o.1",
         ),
         'member2' => "hello, I'm 2",
    );
    
  • PHP 5.4+ Укороченный стиль объявления массива

    $object = (object)[
         'member1' => "hello, I'm 1",
         'member1o' => (object)['member1' => "hello, I'm 1o.1"],
         'member2' => "hello, I'm 2",
    ];
    

Оба получат точно такой же результат:

stdClass Object
(
    [member1] => hello, I'm 1
    [member1o] => stdClass Object
        (
            [member1] => hello, I'm 1o.1
        )

    [member2] => hello, I'm 2
)

NJoy!

Ответ 4

Вы можете попробовать:

function initStdClass($thing) {
    if (is_array($thing)) {
      return (object) array_map(__FUNCTION__, $thing);
    }
    return $thing;
}

Ответ 5

Я использую класс я name Dict:

class Dict {

    public function __construct($values = array()) {
        foreach($values as $k => $v) {
            $this->{$k} = $v;
        }
    }
}

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

Ответ 6

Вы можете использовать:

$object = (object)[]; // shorter version of (object)array();

$object->foo = 'bar';

Ответ 7

from this > ответьте на аналогичный вопрос:

Начиная с PHP7, Анонимные классы, которые позволят вам расширить класс во время выполнения, включая установка дополнительных свойств:

$a = new class() extends MyObject {
    public $property1 = 1;
    public $property2 = 2;
};

echo $a->property1; // prints 1

Это не так лаконично, как инициализатор для массива. Не уверен, буду ли я использовать его. Но это еще один вариант, который вы можете рассмотреть.

Ответ 8

Другим вариантом преобразования deep является использование json_encode + json_decode (он по умолчанию дешифрует по умолчанию stdClass). Таким образом вам не придется повторять (object) приведение в каждом вложенном объекте.

$object = json_decode(json_encode(array(
     'member1' => "hello, I'm 1",
     'member1o' => array(
         'member1' => "hello, I'm 1o.1",
     ),
     'member2' => "hello, I'm 2",
)));

выход:

php > print_r($object);
stdClass Object
(
    [member1] => hello, I'm 1
    [member1o] => stdClass Object
        (
            [member1] => hello, I'm 1o.1
        )

    [member2] => hello, I'm 2
)