Как преобразовать массив в объект в PHP?

Как я могу преобразовать такой массив в объект?

[128] => Array
    (
        [status] => "Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution."
    )

[129] => Array
    (
        [status] => "The other day at work, I had some spare time"
    )

person streetparade    schedule 08.12.2009    source источник
comment
Какой именно объект вы хотите получить? Я имею в виду: какими должны быть атрибуты?   -  person Pascal MARTIN    schedule 08.12.2009
comment
в цикле должно быть и то, и другое, потому что статус - это один массив данных, поэтому оба печатаются   -  person streetparade    schedule 08.12.2009
comment
не знаю когда, но это просто работает: $a = (object)['hello' => 'world'];   -  person    schedule 05.11.2016


Ответы (34)


В простейшем случае, вероятно, достаточно «преобразовать» массив как объект:

$object = (object) $array;

Другой вариант - создать экземпляр стандартного класса в качестве переменной и перебрать ваш массив при повторном присвоении значений:

$object = new stdClass();
foreach ($array as $key => $value)
{
    $object->$key = $value;
}

Как отметил Эдсон Медина, действительно чистым решением является использование встроенных json_ функций:

$object = json_decode(json_encode($array), FALSE);

Это также (рекурсивно) преобразует все ваши подмассивы в объекты, которые вы можете или не хотите. К сожалению, у него в 2-3 раза больше производительности по сравнению с циклическим подходом.

Предупреждение! (спасибо Ultra за комментарий):

json_decode в разных средах по-разному конвертирует данные UTF-8. В итоге я получаю значения «240.00» на местном уровне и «240» на производстве - огромная катастрофа. Morover, если преобразование не удается, строка возвращается как NULL

person jlb    schedule 08.12.2009
comment
поскольку переменные не могут начинаться с цифр, да, они могут: $ object - ›{3} = 'xyz'; - person chelmertz; 10.12.2009
comment
имеет 2-3-кратное снижение производительности, что является несправедливым сравнением, поскольку последний метод возвращает рекурсивные объекты, в то время как подход цикла без дополнительных условий (как в ответе @streetparade) преобразует только первый уровень. - person feeela; 13.05.2013
comment
@feeela Я вообще не думаю, что это несправедливо ... я упоминал, что преобразование выполняется рекурсивно. Кроме того, снижение производительности в 2-3 раза было достигнуто при использовании плоского входного массива (который не использовал бы рекурсию). - person jlb; 13.05.2013
comment
ПРЕДУПРЕЖДЕНИЕ! json_decode в разных средах по-разному конвертирует данные UTF-8. В итоге я получаю значения «240.00» на местном уровне и «240» на производстве - огромная катастрофа. Morover, если преобразование не удается, строка возвращается как NULL - person Szymon Toda; 05.11.2014
comment
Можно ли это использовать с настраиваемым классом, не stdClass()? А как насчет json-метода? Я сомневаюсь, что это будет использовать какую-либо определенную структуру классов - person phil294; 26.12.2016
comment
Что касается решения json_decode (..., false), я заметил, что, если в массиве не установлены ключи, он тоже не работает. Например. json_decode (json_encode (['test']), ложь); возвращает массив, что имеет смысл, но может быть проблемой в отношении этих конкретных предложений из op. - person John Doe; 28.06.2018
comment
Обратите внимание, что при использовании функций json_ * ссылки (например, на другие массивы), хранящиеся в исходном массиве, в этом случае будут дублироваться. Скажем, ключ x в массиве содержит ссылку на другой массив. Тогда $object->x после выполнения вашего однострочного файла будет дубликатом $array['x'], а не ссылкой на исходный массив. В некоторых приложениях это может быть безвредно, но для больших массивов тратит память и может испортить выполнение, если ссылка будет использоваться позже. - person The Coprolal; 13.12.2018
comment
@chelmertz В php7 $obj->(3) выдает ошибку. Вместо этого используйте переменную $obj->$foo, где $foo=3, $foo=(3) или $foo="3". Все работает! - person umesh kadam; 03.08.2019
comment
@umeshkadam, потому что $obj->(3) - синтаксическая ошибка. Буквально только что я запустил пример на php 7.3, чтобы показать суть, и он действительно работает. Кроме того, ваш $obj->$foo - не лучший способ его написать, потому что он подразумевает переменную переменную, которая, хотя и эквивалентна, трудна для чтения и понимания. не делай этого (ИМХО) - person Zarathuztra; 04.10.2019

вы можете просто использовать приведение типов для преобразования массива в объект.

// *convert array to object* Array([id]=> 321313[username]=>shahbaz)
$object = (object) $array_name;

//now it is converted to object and you can access it.
echo $object->username;
person Shahbaz    schedule 17.09.2013

Легче всего было бы

$object = (object)$array;

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

person johannes    schedule 08.12.2009
comment
не работает, я сделал это до того, как задал вопрос здесь, так что должен быть другой способ сделать это - person streetparade; 08.12.2009
comment
Почему он должен объяснять причину своего желания использовать предметы? Я не думаю, что это имеет отношение к как это делается. Может, ему нужно их json_encode или сериализовать? Для этого могут быть десятки причин. - person zombat; 08.12.2009
comment
хм .. я посмотрел на вывод браузера, он выглядит так: объект (stdClass) # 150 (130) {[0] = ›array (1) {[status] =› string (130) Наконец-то пользователи Mac и Linux не Не нужно чувствовать себя гражданами второго сорта в стране Chrome: у них есть официальная бета-версия…} официально это объект, но как выполнить итерацию, чтобы я мог получить статус, например $ obj- ›status any idea? - person streetparade; 08.12.2009
comment
zombat, кодирование JSON не является причиной для использования объекта, в json_encode () есть флаг для использования объектов. с сериализацией потребуется конкретный тип объекта, ожидаемый получателем. И вообще стараюсь помочь с актуальной проблемой. для меня этот вопрос означает, что где-то еще есть архитектурная ошибка. - person johannes; 08.12.2009

Быстрый взлом:

// assuming $var is a multidimensional array
$obj = json_decode (json_encode ($var), FALSE);

Не очень красиво, но работает.

person Edson Medina    schedule 27.03.2012
comment
Мне действительно нравится это решение, использование встроенных функций вместо пользовательских всегда быстрее, и это отлично работает. Спасибо за совет. - person aknatn; 27.05.2012
comment
@Oddant Это решает проблему, упомянутую выше (преобразование массива в объект). Ваша напыщенная речь должна быть направлена ​​в основной пост, а не в мое решение. - person Edson Medina; 29.05.2013
comment
@EdsonMedina Да, но мой пост слишком неудачный. - person vdegenne; 29.05.2013
comment
@Oddant, чтобы быть справедливым по отношению к @EdsonMedina, исходный вопрос не указывает, какая видимость необходима атрибутам, и, поскольку OP не использует $this в комментариях, которые следуют в качестве средства доступа, в значительной степени подразумевается, что он / она желает экземпляр stdClass в качестве вывода а не определяемый пользователем класс, который используется в вашем ответе. Я согласен с элегантностью этого решения, но, к сожалению, это довольно часто используемый шаблон для решения этой проблемы с вложенными массивами, где приведение к объекту не работает. Также возможно, что OP использует интерфейс, для которого в качестве входных данных требуется объект и, а не массив. - person DeaconDesperado; 19.06.2013
comment
Не забывайте, что, используя этот способ, вы потеряете все, кроме основных типов. Например, DateTime будет преобразователем stdObject. - person Denis Pshenov; 04.11.2014
comment
Заметил, что это не работает для простых массивов вроде этого: json_decode (json_encode (['test']), false); Это дает тот же массив, который использовался для ввода - person John Doe; 28.06.2018
comment
@JohnDoe вопрос касается ассоциативных массивов, а не простых массивов. - person Edson Medina; 29.06.2018
comment
@EdsonMedina Ага, я это знала. Этот вопрос - один из первых результатов, которые вы найдете в Google, если ищете преобразование массива в объект. Я подумал, что эта деталь может быть кому-то актуальна. В частности, исходный массив из op предполагает, что ответы могут работать и для простых массивов. - person John Doe; 01.07.2018

Вот три способа:

  1. Подделать реальный объект:

    class convert
    {
        public $varible;
    
        public function __construct($array)
        {
            $this = $array;
        }
    
        public static function toObject($array)
        {
            $array = new convert($array);
            return $array;
        }
    }
    
  2. Преобразуйте массив в объект, преобразовав его в объект:

    $array = array(
        // ...
    );
    $object = (object) $array;
    
  3. Вручную преобразуйте массив в объект:

    $object = object;
    foreach ($arr as $key => $value) {
        $object->{$key} = $value;
    }
    
person Julius F    schedule 08.12.2009
comment
хм, спасибо, но ваш класс лица выдает следующую ошибку Неустранимая ошибка: невозможно повторно назначить $ this в /var/www/bot/inc/twitter-bot.php в строке 10 - person streetparade; 08.12.2009
comment
и typcasint @ reference не является хорошей идеей, даже если это не сработает, вот что я получил неожиданный T_OBJECT_CAST, ожидая T_NEW или T_STRING или T_VARIABLE или '$' - person streetparade; 08.12.2009
comment
Извините, да, это было очевидно, еще не проверено, но я подумал дать быстрый и краткий ответ, в следующий раз я потрачу больше времени на тестирование;) Я продолжу дальнейшее тестирование кастинга, когда я обновлюсь до PHP v5.3.1 . - person Julius F; 09.12.2009
comment
$ array = & (object) $ array == Хорошая реализация KISS! - person mate64; 30.12.2011
comment
Зачем кому-то нужно использовать другой метод, чем 2)? Есть ли минусы? - person Yogu; 27.02.2014
comment
Вариант 2 самый чистый. - person ᴍᴀᴛᴛ ʙᴀᴋᴇʀ; 13.05.2014
comment
приведение массива к объекту не работает с вложенными массивами - person minhaj; 23.11.2015

Его путь к простому, это также создаст объект для рекурсивных массивов:

$object = json_decode(json_encode((object) $yourArray), FALSE);
person star18bit    schedule 03.03.2016
comment
передача false в json_decode() вернет ассоциативный массив. - person Rusty; 25.10.2016
comment
@ user3284463 Передача true в json_decode вернет ассоциативный массив, false по умолчанию и вернет экземпляр StdClass. - person Elliot Reed; 11.09.2018

В зависимости от того, где вам это нужно и как получить доступ к объекту, есть разные способы сделать это.

Например: просто введите тип

$object =  (object) $yourArray;

Однако наиболее совместимым является использование служебного метода (еще не являющегося частью PHP), который реализует стандартное приведение PHP на основе строки, которая указывает тип (или игнорируя ее, просто разыменуя значение):

/**
 * dereference a value and optionally setting its type
 *
 * @param mixed $mixed
 * @param null  $type (optional)
 *
 * @return mixed $mixed set as $type
 */
function rettype($mixed, $type = NULL) {
    $type === NULL || settype($mixed, $type);
    return $mixed;
}

Пример использования в вашем случае (онлайн-демонстрация):

$yourArray = Array('status' => 'Figure A. ...');

echo rettype($yourArray, 'object')->status; // prints "Figure A. ..."
person hakre    schedule 13.07.2013

Вы можете использовать функцию (object) для преобразования вашего массива в объект.

$arr= [128=> ['status'=>
                 'Figure A. Facebook \'s horizontal scrollbars showing up on a 1024x768 screen resolution.'],
                  129=>['status'=>'The other day at work, I had some spare time']];

            $ArrToObject=(object)$arr;
            var_dump($ArrToObject);

Результатом будет объект, содержащий массивы:

объект (stdClass) # 1048 (2) {[128] => массив (1) {

["status"] => string (87) "Рисунок A. Горизонтальные полосы прокрутки Facebook, отображаемые при разрешении экрана 1024x768." }

[129] => array (1) {["status"] => string (44) "На днях на работе у меня было свободное время"}}

person Noha Shehab    schedule 12.06.2019
comment
Здесь (объект) не функция, вы просто произвели приведение типа. - person habib; 12.02.2021
comment
Строго говоря, это не приведение типов, поскольку вы меняете тип values ​​, а не переменные. См. stackoverflow.com/a/1147377/6144626 - person Ari Cooper-Davis; 18.03.2021

Это сработало для меня

  function array_to_obj($array, &$obj)
  {
    foreach ($array as $key => $value)
    {
      if (is_array($value))
      {
      $obj->$key = new stdClass();
      array_to_obj($value, $obj->$key);
      }
      else
      {
        $obj->$key = $value;
      }
    }
  return $obj;
  }

function arrayToObject($array)
{
 $object= new stdClass();
 return array_to_obj($array,$object);
}

использование:

$myobject = arrayToObject($array);
print_r($myobject);

возвращает:

    [127] => stdClass Object
        (
            [status] => Have you ever created a really great looking website design
        )

    [128] => stdClass Object
        (
            [status] => Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
        )

    [129] => stdClass Object
        (
            [status] => The other day at work, I had some spare time
        )

как обычно, вы можете зациклить это так:

foreach($myobject as $obj)
{
  echo $obj->status;
}
person streetparade    schedule 08.12.2009
comment
Но этот примерно на 500% медленнее (проверено), чем приведение типов: $ obj = (object) $ array; - person xZero; 13.07.2017
comment
@xZero, но $obj = (object) $array; не работает для многомерных массивов. - person Jeff Puckett; 22.11.2017

Насколько мне известно, встроенного метода для этого нет, но это так же просто, как простой цикл:

    $obj= new stdClass();

    foreach ($array as $k=> $v) {
        $obj->{$k} = $v;
    }

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

person zombat    schedule 08.12.2009

На самом деле, если вы хотите использовать это с многомерными массивами, вы захотите использовать некоторую рекурсию.

static public function array_to_object(array $array)
{
    foreach($array as $key => $value)
    {
        if(is_array($value))
        {
            $array[$key] = self::array_to_object($value);
        }
    }
    return (object)$array;
}
person Nezzy    schedule 10.05.2011

У меня тоже была эта проблема, но я заметил, что json_decode преобразует массив JSON в объект.

Итак, я пришел к своему решению, используя json_encode ($ PHPArray), который возвращает строку объекта JSON, затем я декодировал строку с помощью Json_decode ($ string), и он вернул бы идеально структурированный объект. Сокращение

$object = json_decode(json_encode($array));

Or

$jsonString = json_encode($array);
$object = json_decode($jsonString);
person Uchephilz    schedule 15.07.2020
comment
Это должен быть правильный ответ - person Plugie; 23.01.2021

Я бы определенно пошел таким чистым путем:

<?php

class Person {

  private $name;
  private $age;
  private $sexe;

  function __construct ($payload)
  {
     if (is_array($payload))
          $this->from_array($payload);
  }


  public function from_array($array)
  {
     foreach(get_object_vars($this) as $attrName => $attrValue)
        $this->{$attrName} = $array[$attrName];
  }

  public function say_hi ()
  {
     print "hi my name is {$this->name}";
  }
}

print_r($_POST);
$mike = new Person($_POST);
$mike->say_hi();

?>

если вы отправите:

formulaire

вы получите это:

mike

Я обнаружил, что это более логичное сравнение приведенных выше ответов от объектов, которые следует использовать для той цели, для которой они были созданы (инкапсулированные милые маленькие объекты).

Также использование get_object_vars гарантирует, что в управляемом объекте не будут созданы дополнительные атрибуты (вы не хотите, чтобы у машины была фамилия, или у человека, ведущего себя на четырех колесах).

person vdegenne    schedule 24.05.2013
comment
Почему бы вам не использовать $ attr_value вместо $ array [$ attr_name]; в вашей публичной функции from_array ($ array) function - person Sakkeer Hussain; 08.04.2015

Немного сложная, но легко расширяемая техника:

Предположим, у вас есть массив

$a = [
     'name' => 'ankit',
     'age' => '33',
     'dob' => '1984-04-12'
];

Предположим, у вас есть класс Person, который может иметь больше или меньше атрибутов из этого массива. Например

class Person 
{
    private $name;
    private $dob;
    private $age;
    private $company;
    private $city;
}

Если вы все еще хотите изменить свой массив на объект человека. Вы можете использовать класс ArrayIterator.

$arrayIterator = new \ArrayIterator($a); // Pass your array in the argument.

Теперь у вас есть объект-итератор.

Создайте класс, расширяющий FilterIterator Class; где вам нужно определить абстрактный метод accept. Следуй примеру

class PersonIterator extends \FilterIterator
{
    public function accept()
    {
        return property_exists('Person', parent::current());
    }
}

Вышеупомянутая импелментация привяжет свойство только в том случае, если оно существует в классе.

Добавьте еще один метод в класс PersonIterator

public function getObject(Person $object)
{
        foreach ($this as $key => $value)
        {
            $object->{'set' . underscoreToCamelCase($key)}($value);
        }
        return $object;
}

Убедитесь, что в вашем классе определены мутаторы. Теперь вы готовы вызывать эти функции там, где хотите создать объект.

$arrayiterator = new \ArrayIterator($a);
$personIterator = new \PersonIterator($arrayiterator);

$personIterator->getObject(); // this will return your Person Object. 
person Ankit Vishwakarma    schedule 17.05.2017

Вы также можете использовать ArrayObject, например:

<?php
    $arr = array("test",
                 array("one"=>1,"two"=>2,"three"=>3), 
                 array("one"=>1,"two"=>2,"three"=>3)
           );
    $o = new ArrayObject($arr);
    echo $o->offsetGet(2)["two"],"\n";
    foreach ($o as $key=>$val){
        if (is_array($val)) {
            foreach($val as $k => $v) {
               echo $k . ' => ' . $v,"\n";
            }
        }
        else
        {
               echo $val,"\n";
        }
    }
?>

//Output:
  2
  test
  one => 1
  two => 2
  three => 3
  one => 1
  two => 2
  three => 3
person slevy1    schedule 12.10.2014
comment
На мой взгляд, это должен быть лучший ответ. Дополнительная информация: php.net/manual/en/arrayobject.construct.php - person Julian; 29.05.2015

Тот, который я использую (это член класса):

const MAX_LEVEL = 5; // change it as needed

public function arrayToObject($a, $level=0)
{

    if(!is_array($a)) {
        throw new InvalidArgumentException(sprintf('Type %s cannot be cast, array expected', gettype($a)));
    }

    if($level > self::MAX_LEVEL) {
        throw new OverflowException(sprintf('%s stack overflow: %d exceeds max recursion level', __METHOD__, $level));
    }

    $o = new stdClass();
    foreach($a as $key => $value) {
        if(is_array($value)) { // convert value recursively
            $value = $this->arrayToObject($value, $level+1);
        }
        $o->{$key} = $value;
    }
    return $o;
}
person TimSparrow    schedule 11.04.2018

рекурсия - ваш друг:

function __toObject(Array $arr) {
    $obj = new stdClass();
    foreach($arr as $key=>$val) {
        if (is_array($val)) {
            $val = __toObject($val);
        }
        $obj->$key = $val;
    }

    return $obj;
}
person minhaj    schedule 23.11.2015

Для этого требуется PHP7, потому что я решил использовать лямбда-функцию, чтобы заблокировать «внутреннюю функцию» внутри основной функции. Лямбда-функция вызывается рекурсивно, отсюда необходимость: "use (& $ innerfunc)". Вы могли сделать это в PHP5, но не могли скрыть внутреннюю функцию.

function convertArray2Object($defs) {
    $innerfunc = function ($a) use ( &$innerfunc ) {
       return (is_array($a)) ? (object) array_map($innerfunc, $a) : $a; 
    };
    return (object) array_map($innerfunc, $defs);
}
person Chris Jeffries    schedule 10.11.2017

используйте эту функцию, которую я сделал:

function buildObject($class,$data){
    $object = new $class;
    foreach($data as $key=>$value){
        if(property_exists($class,$key)){
            $object->{'set'.ucfirst($key)}($value);
        }
    }
    return $object;
}

Использование:

$myObject = buildObject('MyClassName',$myArray);
person Douraid Arfaoui    schedule 27.09.2016

один лайнер

$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));
person YesItsMe    schedule 07.09.2017
comment
Обратите внимание, что ссылки (например, на другие массивы), хранящиеся в исходном массиве, будут дублироваться этим однострочным. Скажем, ключ x в массиве содержит ссылку на другой массив. Тогда $object->x после выполнения вашего однострочного файла будет дубликатом $result_array['x'], а не идентичным массивом. - person The Coprolal; 13.12.2018

Легкий:

$object = json_decode(json_encode($array));

Пример:

$array = array(
    'key' => array(
        'k' => 'value',
    ),
    'group' => array('a', 'b', 'c')
);

$object = json_decode(json_encode($array));

Тогда верно следующее:

$object->key->k === 'value';
$object->group === array('a', 'b', 'c')
person Eduardo Cuomo    schedule 08.05.2013
comment
Я думаю, это обходной путь. Зачем кодировать массив в json, а затем декодировать его? Для меня это не оптимальное решение. - person Julian; 29.05.2015
comment
@Julian, потому что он работает рекурсивно, делает это правильно определенным и достаточно надежным (стандартным) способом, а также достаточно быстр, чтобы быть хорошей альтернативой случайной закодированной вручную магии обезьян. - person Sz.; 27.07.2015

Вы также можете сделать это, добавив (объект) слева от переменной, чтобы создать новый объект.

<?php
$a = Array
    ( 'status' => " text" );
var_dump($a);
$b = (object)$a;
var_dump($b);
var_dump($b->status);

http://codepad.org/9YmD1KsU

person fedmich    schedule 14.12.2012
comment
возможно, стоит упомянуть, что это называется приведением типа или приведением типа: php.net/manual/en/ и поведение (object) array () задокументировано здесь: php.net/manual/en/ - person Pete; 12.07.2013

Использование json_encode проблематично из-за способа обработки данных, отличных от UTF-8. Стоит отметить, что метод _2 _ / _ 3_ также оставляет неассоциативные массивы как массивы. Это может быть то, что вы хотите, а может и не быть. Недавно мне пришлось воссоздать функциональность этого решения, но без использования json_ функций. Вот что я придумал:

/**
 * Returns true if the array has only integer keys
 */
function isArrayAssociative(array $array) {
    return (bool)count(array_filter(array_keys($array), 'is_string'));
}

/**
 * Converts an array to an object, but leaves non-associative arrays as arrays. 
 * This is the same logic that `json_decode(json_encode($arr), false)` uses.
 */
function arrayToObject(array $array, $maxDepth = 10) {
    if($maxDepth == 0) {
        return $array;
    }

    if(isArrayAssociative($array)) {
        $newObject = new \stdClass;
        foreach ($array as $key => $value) {
            if(is_array($value)) {
                $newObject->{$key} = arrayToObject($value, $maxDepth - 1);
            } else {
                $newObject->{$key} = $value;
            }
        }
        return $newObject;
    } else {

        $newArray = array();
        foreach ($array as $value) {
            if(is_array($value)) {
                $newArray[] = arrayToObject($value, $maxDepth - 1);
            } else {
                $newArray[] = $value;
            }                
        }
        return $newArray;
    }
}
person DavidH    schedule 25.08.2015

Лучший метод в МИРЕ :)

function arrayToObject($conArray)
{
    if(is_array($conArray)){
        /*
        * Return array converted to object
        * Using __FUNCTION__ (Magic constant)
        * for recursive call
        */
        return (object) array_map(__FUNCTION__, $conArray);
    }else{
        // Return object
        return $conArray;
    }
}

если вы воспользуетесь другими методами, у вас возникнут проблемы. Это лучший способ. Вы когда-нибудь видели.

person Zezeron    schedule 02.04.2016

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

   function convert_array_to_object($array){
      $obj= new stdClass();
      foreach ($array as $k=> $v) {
         if (is_array($v)){
            $v = convert_array_to_object($v);   
         }
         $obj->{strtolower($k)} = $v;
      }
      return $obj;
   }

И помните, что если в массиве есть числовые ключи, на них все равно можно ссылаться в результирующем объекте, используя {} (например: $obj->prop->{4}->prop)

person Ben D    schedule 13.05.2012

Многомерные массивы в объект. этот код используется для преобразования метода try and catch API поиска Bing.

try {
        // Perform the Web request and get the JSON response
        $context = stream_context_create($options);
        $results = file_get_contents($url . "?cc=" . $country . "&category=" . $type, false, $context);
        $results = json_decode($results);
        return response()->json($results);
    } catch (\Exception $e) {
        $results = array('value' => array(
                (object) array(
                    "name" => "Unable to Retrive News",
                    "url" => "http://www.sample.com/",
                    "image" => (object) array("thumbnail" => (object) array("contentUrl" => "")),
                    "publishedAt" => "",
                    "description" => "")
            )
        );
        $results = (object) $results;
        return response()->json($results);
    }
person Krishnamoorthy Acharya    schedule 04.11.2018

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

<?php

$array = ['name'=>'maria','age'=>33];

class Person {

    public $name;
    public $age;

    public function __construct(string $name, string $age){
        $this->name  = $name;
        $this->age = $age;
    }
}

function arrayToObject(array $array, string $class_name){

    $r = new ReflectionClass($class_name);
    $object = $r->newInstanceWithoutConstructor();
    $list = $r->getProperties();
    foreach($list as $prop){
      $prop->setAccessible(true);
      if(isset($array[$prop->name]))
        $prop->setValue($object, $array[$prop->name]);
    } 

    return $object;

}

$pessoa1 = arrayToObject($array, 'Person');
var_dump($pessoa1);
person celsowm    schedule 11.05.2019

В CakePHP есть рекурсивный класс Set :: map, который в основном отображает массив в объект. Возможно, вам придется изменить внешний вид массива, чтобы объект выглядел так, как вы хотите.

http://api.cakephp.org/view_source/set/#line-158 < / а>

В худшем случае вы сможете почерпнуть несколько идей из этой функции.

person Dooltaz    schedule 08.12.2009

Вдохновленный всеми этими кодами, я попытался создать расширенную версию с поддержкой: определенного имени класса, избегания метода конструктора, шаблона bean-компонентов и строгого режима (установка только существующих свойств):

    class Util {

static function arrayToObject($array, $class = 'stdClass', $strict = false) {
        if (!is_array($array)) {
            return $array;
        }

        //create an instance of an class without calling class's constructor
        $object = unserialize(
                sprintf(
                        'O:%d:"%s":0:{}', strlen($class), $class
                )
        );

        if (is_array($array) && count($array) > 0) {
            foreach ($array as $name => $value) {
                $name = strtolower(trim($name));
                if (!empty($name)) {

                    if(method_exists($object, 'set'.$name)){
                        $object->{'set'.$name}(Util::arrayToObject($value));
                    }else{
                        if(($strict)){

                            if(property_exists($class, $name)){

                                $object->$name = Util::arrayToObject($value); 

                            }

                        }else{
                            $object->$name = Util::arrayToObject($value); 
                        }

                    }

                }
            }
            return $object;
        } else {
            return FALSE;
        }
        }
}
person celsowm    schedule 30.07.2012

Код

Эта функция работает так же, как json_decode(json_encode($arr), false).

function arrayToObject(array $arr)
{
    $flat = array_keys($arr) === range(0, count($arr) - 1);
    $out = $flat ? [] : new \stdClass();

    foreach ($arr as $key => $value) {
        $temp = is_array($value) ? $this->arrayToObject($value) : $value;

        if ($flat) {
            $out[] = $temp;
        } else {
            $out->{$key} = $temp;
        }
    }

    return $out;
}

Тестирование

Тест 1: плоский массив

$arr = ["a", "b", "c"];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));

Вывод:

array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
)
array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
)

Тест 2: Массив объектов

$arr = [["a" => 1], ["a" => 1], ["a" => 1]];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));

Вывод:

array(
    0 => stdClass::__set_state(array('a' => 1,)),
    1 => stdClass::__set_state(array('a' => 1,)),
    2 => stdClass::__set_state(array('a' => 1,)),
)
array(
    0 => stdClass::__set_state(array('a' => 1,)),
    1 => stdClass::__set_state(array('a' => 1,)),
    2 => stdClass::__set_state(array('a' => 1,)),
)

Тест 3: Объект

$arr = ["a" => 1];
var_export(json_decode($arr));
var_export($this->arrayToObject($arr));

Вывод:

stdClass::__set_state(array('a' => 1,))
stdClass::__set_state(array('a' => 1,))
person acelot    schedule 27.07.2015

я сделал это довольно простым способом,

    $list_years         = array();
    $object             = new stdClass();

    $object->year_id   = 1 ;
    $object->year_name = 2001 ;
    $list_years[]       = $object;
person Muhammad    schedule 02.08.2013

Используя (массив) и (объект) в качестве префикса, вы можете просто преобразовать массив объектов в стандартный массив и наоборот.

<?php
//defining an array
$a = array('a'=>'1','b'=>'2','c'=>'3','d'=>'4');

//defining an object array
$obj = new stdClass();
$obj->a = '1';
$obj->b = '2';
$obj->c = '3';
$obj->d = '4';

print_r($a);echo '<br>';
print_r($obj);echo '<br>';

//converting object array to array
$b = (array) $obj;
print_r($b);echo '<br>';

//converting array to object
$c = (object) $a;
print_r($c);echo '<br>';
?>
person rb vishnu    schedule 30.12.2014

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

Это проверяет все предоставленные массивы, есть ли там скрытые объекты, и превращает их также в объекты.

    /**
     * Makes a config object from an array, making the first level keys properties a new object.
     * Property values are converted to camelCase and are not set if one already exists.
     * @param array $configArray Config array.
     * @param boolean $strict To return an empty object if $configArray is not an array
     * @return stdObject The config object
     */
    public function makeConfigFromArray($configArray = [],$strict = true)
    {
        $object = new stdClass();

        if (!is_array($configArray)) {
            if(!$strict && !is_null($configArray)) {
                return $configArray;
            }
            return $object;
        }

        foreach ($configArray as $name => $value) {
            $_name = camel_case($name);
            if(is_array($value)) {
                $makeobject = true;
                foreach($value as $key => $val) {
                    if(is_numeric(substr($key,0,1))) {
                        $makeobject = false;
                    }
                    if(is_array($val)) {
                        $value[$key] = $this->makeConfigFromArray($val,false);
                    }
                }
                if($makeobject) {
                    $object->{$name} = $object->{$_name} = $this->makeConfigFromArray($value,false);
                }
                else {
                    $object->{$name} = $object->{$_name} = $value;
                }

            }
            else {
                $object->{$name} = $object->{$_name} = $value;
            }
        }

        return $object;
    }

Это превращает yaml, настроенный как

fields:
    abc:
        type: formfield
        something:
            - a
            - b
            - c
            - d:
                foo: 
                   bar

в массив, состоящий из:

array:1 [
  "fields" => array:1 [
    "abc" => array:2 [
      "type" => "formfield"
      "something" => array:4 [
        0 => "a"
        1 => "b"
        2 => "c"
        3 => array:1 [
          "d" => array:1 [
            "foo" => "bar"
          ]
        ]
      ]
    ]
  ]
]

объекту:

{#325
  +"fields": {#326
    +"abc": {#324
      +"type": "formfield"
      +"something": array:4 [
        0 => "a"
        1 => "b"
        2 => "c"
        3 => {#328
          +"d": {#327
            +"foo": "bar"
          }
        }
      ]
    }
  }
}
person Tschallacka    schedule 03.06.2016

Если вам нужно привести массив к определенному классу (как в моем случае мне нужно, чтобы объект имел тип Google_Service_AndroidPublisher_Resource_Inappproducts для моего макета), вы можете str_replace имя класса из stdClass на предполагаемый класс следующим образом:

function castArrayToClass(array $array, string $className)
{
    //first cast the array to stdClass
    $subject = serialize((object)$array);
    //then change the class name
    $converted = str_replace(
        'O:8:"stdClass"',
        'O:'.strlen($className).':"'.$className.'"',
        $subject
    );
    unset($subject);

    return unserialize($converted);
}
person PHZ.fi-Pharazon    schedule 03.04.2021