Я интегрирую API на свой веб-сайт, который работает с данными, хранящимися в объектах, в то время как мой код написан с использованием массивов.
Мне бы хотелось, чтобы быстрая и грязная функция конвертировала объект в массив.
Просто введите его
$array = (array) $yourObject;
Из массивов :
Если объект преобразуется в массив, результатом является массив, элементы которого являются свойствами объекта. Ключи являются именами переменных-членов, с несколькими заметными исключениями: целочисленные свойства недоступны; закрытые переменные имеют имя класса, добавленное к имени переменной; Защищенные переменные имеют «*» перед именем переменной. Эти предварительно добавленные значения имеют нулевые байты с обеих сторон.
Пример: простой объект
$object = new StdClass;
$object->foo = 1;
$object->bar = 2;
var_dump( (array) $object );
Вывод:
array(2) {
'foo' => int(1)
'bar' => int(2)
}
Пример: сложный объект
class Foo
{
private $foo;
protected $bar;
public $baz;
public function __construct()
{
$this->foo = 1;
$this->bar = 2;
$this->baz = new StdClass;
}
}
var_dump( (array) new Foo );
Вывод (с \ 0s отредактирован для ясности):
array(3) {
'\0Foo\0foo' => int(1)
'\0*\0bar' => int(2)
'baz' => class stdClass#2 (0) {}
}
Вывести var_export
вместо var_dump
:
array (
'' . "\0" . 'Foo' . "\0" . 'foo' => 1,
'' . "\0" . '*' . "\0" . 'bar' => 2,
'baz' =>
stdClass::__set_state(array(
)),
)
Такая типизация не будет выполнять глубокое приведение графа объекта, и вам необходимо применить нулевые байты (как объяснено в ручной цитате) для доступа к любым непубличным атрибутам. Так что это лучше всего работает при приведении объектов StdClass или объектов только с открытыми свойствами. Для быстрой и грязной (что вы просили) это хорошо.
Также посмотрите это подробное сообщение в блоге:
ArrayAccess
интерфейс, возможно, в сочетании с этим решением. php.net/manual/en/class.arrayaccess.php[1 => "one"]
становится["1" => "one"]
(array)
и(object)
работает надежно и одинаково во всех версиях начиная с PHP 4.3. Смотрите 3v4l.org/X6lhm . Если вы получили синтаксическую ошибку, вы сделали что-то не так.empty
Журнал изменений» . Вы не можете использовать выражениеempty
до 5.5. Это совершенно не связано с приведением типов;)Вы можете быстро преобразовать глубоко вложенные объекты в ассоциативные массивы, полагаясь на поведение функций кодирования / декодирования JSON:
источник
От первого попадания Google для « PHP-объекта до связанного массива » мы имеем это:
Источник находится на codesnippets.joyent.com .
источник
function objectToArray($o) { $a = array(); foreach ($o as $k => $v) $a[$k] = (is_array($v) || is_object($v)) ? objectToArray($v): $v; return $a; }
это просто устанавливает все, что не является объектом или массивом и продолжается без повторного вызова метода, если это необходимо.Если свойства вашего объекта общедоступны, вы можете сделать:
Если они являются частными или защищенными, у них будут странные имена ключей в массиве. Итак, в этом случае вам понадобится следующая функция:
источник
Вывод
источник
Вот некоторый код:
источник
Все остальные ответы, опубликованные здесь, работают только с открытыми атрибутами. Вот одно решение, которое работает с JavaBeans- подобными объектами, используя отражение и геттеры:
источник
public
свойств?Как насчет
get_object_vars($obj)
? Это кажется полезным, если вы хотите получить доступ только к открытым свойствам объекта.Смотрите get_object_vars .
источник
Тип приведите ваш объект в массив.
Это решит вашу проблему.
источник
Прежде всего, если вам нужен массив из объекта, вы, вероятно, должны сначала составить данные в виде массива. Думаю об этом.
Не используйте
foreach
оператор или преобразования JSON. Если вы планируете это, вы снова работаете со структурой данных, а не с объектом.Если вам действительно это нужно, используйте объектно-ориентированный подход, чтобы иметь чистый и поддерживаемый код. Например:
Объект как массив
Если вам нужны все свойства, используйте объект переноса:
источник
Вы можете легко использовать эту функцию, чтобы получить результат:
Используйте PHP 5 или более позднюю версию.
источник
Вот моя рекурсивная функция PHP для преобразования объектов PHP в ассоциативный массив:
Пример использования:
источник
$new_arr1 = (array) $my_object;
Чтобы преобразовать объект в массив, просто приведите его явно:
источник
Вы также можете создать функцию в PHP для преобразования массива объектов:
источник
Возможно, вы захотите сделать это, когда вы получаете данные как объекты из баз данных:
источник
Пользовательская функция для преобразования stdClass в массив:
Еще одна пользовательская функция для преобразования Array в stdClass:
Пример использования:
источник
Использование:
Возвращает массив без специальных символов и имен классов.
источник
Этот ответ является всего лишь объединением различных ответов этого поста, но это решение для преобразования объекта PHP с открытыми или закрытыми свойствами с простыми значениями или массивами в ассоциативный массив ...
источник
Некоторые улучшения в "хорошо знакомом" коде
Обратите внимание, что если функция является членом класса (как выше), вы должны изменить
__FUNCTION__
на__METHOD__
источник
Также вы можете использовать Symfony Serializer Component
источник
Для вашего случая было бы правильно / красиво, если бы вы использовали шаблоны «декоратор» или «преобразование модели даты». Например:
Ваша модель
декоратор
Применение
Так будет более красивый и более правильный код.
источник
Преобразование и удаление раздражающих звезд:
Возможно, это будет дешевле, чем использование отражений.
источник
Краткое решение @ SpYk3HH
источник
Поскольку многие люди находят этот вопрос из-за проблем с динамическим доступом к атрибутам объекта, я просто укажу, что вы можете сделать это в PHP:
$valueRow->{"valueName"}
В контексте (удален вывод HTML для удобства чтения):
источник
Используя Typecasting, вы можете решить вашу проблему. Просто добавьте следующие строки в ваш возвращаемый объект:
Вы также можете добавить новый ключ и пару значений к нему, используя:
источник
Я думаю, что это хорошая идея использовать черты для хранения логики преобразования объектов в массивы. Простой пример:
источник
источник
Здесь я создал метод objectToArray () , который также работает с рекурсивными объектами, например, когда
$objectA
содержит, на$objectB
что снова указывает$objectA
.Кроме того, я ограничил вывод открытыми свойствами, используя ReflectionClass. Избавьтесь от этого, если вам это не нужно.
Чтобы идентифицировать уже используемые объекты, я использую защищенное свойство в этом (абстрактном) классе с именем
$this->usedObjects
. Если найден рекурсивный вложенный объект, он будет заменен строкой**recursive**
. В противном случае он потерпит неудачу из-за бесконечного цикла.источник
$usedObjects
не инициализируется при запуске, поэтому повторный вызов несколько раз даст неверные результаты при последующих вызовах. Кроме того, вы не освобождаете его в конце, поэтому ваши объекты никогда не будут удалены из памяти.Вот мое предложение, если у вас есть объекты в объектах даже с частными членами:
источник
Я использую это (требуется рекурсивное решение с правильными ключами):
Пример использования, следующий код:
Напечатает это:
источник