Инициализировать объекты как массивы в 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";
Ответы
Ответ 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
)