it-swarm.com.ru

php stdClass для массива

У меня есть проблема, чтобы преобразовать объект stdClass в массив . Я пытался таким образом:

return (array) $booking;

или же

return (array) json_decode($booking,true);

или же

return (array) json_decode($booking);

Массив до приведения заполнен одной записью, после моей попытки приведения он пустой . Как преобразовать/преобразовать его без удаления его строк?

массив перед приведением:

array(1) {   [0]=>   object(stdClass)#23 (36) {     ["id"]=>     string(1) "2"     ["name"]=>     string(0) ""     ["code"]=>     string(5) "56/13"   } } 

после того, как приведение будет пустым NULL, если я попытаюсь сделать var_dump($booking);

Я также пробовал эту функцию, но всегда пустой:

public function objectToArray($d) {
        if (is_object($d)) {
            // Gets the properties of the given object
            // with get_object_vars function
            $d = get_object_vars($d);
        }

        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return array_map(__FUNCTION__, $d);
        }
        else {
            // Return array
            return $d;
        }
    }
155
Alessandro Minoccheri

Ленивый однострочный метод

Вы можете сделать это за один прием, используя методы JSON, если вы хотите потерять чуть-чуть производительности (хотя некоторые сообщают, что это быстрее, чем рекурсивный просмотр объектов - скорее всего, потому что PHP - медленный при вызове функций ). "Но я уже сделал это" вы говорите. Не совсем - вы использовали json_decode в массиве, но вам нужно сначала закодировать его с json_encode .

Требования

Методы json_encode и json_decode . Они автоматически связаны в PHP 5.2.0 и выше. Если вы используете любую более старую версию, есть также библиотека PECL (в которой сказано, что в этом случае вы должны действительно обновить свою установку PHP. Поддержка 5.1 прекратилась в 2006 году.)


Преобразование arraystdClass -> stdClass

$stdClass = json_decode(json_encode($booking));

Преобразование array/stdClass -> array

В руководстве указан второй аргумент json_decode как:

_/assoc
Когда TRUE, возвращаемые объекты будут преобразованы в ассоциативные массивы.

Следовательно, следующая строка преобразует весь ваш объект в массив:

$array = json_decode(json_encode($booking), true);
351
h2ooooooo

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

return get_object_vars($booking);
59
robzero

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

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

function arrayCastRecursive($array)
{
    if (is_array($array)) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $array[$key] = arrayCastRecursive($value);
            }
            if ($value instanceof stdClass) {
                $array[$key] = arrayCastRecursive((array)$value);
            }
        }
    }
    if ($array instanceof stdClass) {
        return arrayCastRecursive((array)$array);
    }
    return $array;
}

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

$obj = new stdClass;
$obj->aaa = 'asdf';
$obj->bbb = 'adsf43';
$arr = array('asdf', array($obj, 3));

var_dump($arr);
$arr = arrayCastRecursive($arr);
var_dump($arr);

Результат до:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        object(stdClass)[1]
          public 'aaa' => string 'asdf' (length = 4)
          public 'bbb' => string 'adsf43' (length = 6)
      1 => int 3

Результат после:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        array
          'aaa' => string 'asdf' (length = 4)
          'bbb' => string 'adsf43' (length = 6)
      1 => int 3

Заметка:

Протестировано и работает со сложными массивами, где объект stdClass может содержать другие объекты stdClass.

16
Vlad Preda

Пожалуйста, используйте следующую функцию php для преобразования php stdClass в массив

get_object_vars($data)
13
Nalantha

Эта функция работает для меня: 

function cvf_convert_object_to_array($data) {

    if (is_object($data)) {
        $data = get_object_vars($data);
    }

    if (is_array($data)) {
        return array_map(__FUNCTION__, $data);
    }
    else {
        return $data;
    }
}

Ссылка: http://carlofontanos.com/convert-stdclass-object-to-array-in-php/

11
Carlo Fontanos

Просто погуглил и нашел здесь удобную функцию, которая полезна для рекурсивного преобразования объекта stdClass в массив.

<?php
function object_to_array($object) {
 if (is_object($object)) {
  return array_map(__FUNCTION__, get_object_vars($object));
 } else if (is_array($object)) {
  return array_map(__FUNCTION__, $object);
 } else {
  return $object;
 }
}
?>

EDIT: я обновил этот ответ контентом из связанного источника (который также изменился), благодаря mason81 за предложение.

4
shasi kanth

Следующий код прочитает все электронные письма и напечатает тему, текст и дату.

<?php
  $imap=imap_open("Mailbox","Email Address","Password");
  if($imap){$fixMessages=1+imap_num_msg($imap);  //Check no.of.msgs
/*
By adding 1 to "imap_num_msg($imap)" & starting at $count=1
   the "Start" & "End" non-messages are ignored
*/
    for ($count=1; $count<$fixMessages; $count++){
      $objectOverview=imap_fetch_overview($imap,$count,0);
print '<br>$objectOverview: '; print_r($objectOverview);
print '<br>objectSubject ='.($objectOverview[0]->subject));
print '<br>objectDate ='.($objectOverview[0]->date);
      $bodyMessage=imap_fetchbody($imap,$count,1);
print '<br>bodyMessage ='.$bodyMessage.'<br><br>';
    }  //for ($count=1; $count<$fixMessages; $count++)
  }  //if($imap)
  imap_close($imap);
?>

Это выводит следующее:

$objectOverview: Array ( [0] => stdClass Object ( [subject] => Hello
[from] => Email Address [to] => Email Address [date] => Sun, 16 Jul 2017 20:23:18 +0100
[message_id] =>  [size] => 741 [uid] => 2 [msgno] => 2 [recent] => 0 [flagged] => 0 
[answered] => 0 [deleted] => 0 [seen] => 1 [draft] => 0 [udate] => 1500232998 ) )
objectSubject =Hello
objectDate =Sun, 16 Jul 2017 20:23:18 +0100
bodyMessage =Test 

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

0
walter1957

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

class Formatter
{
    public function objectToArray($data)
    {
        if (is_object($data)) {
            $data = get_object_vars($data);
        }

        if (is_array($data)) {
            return array_map(array($this, 'objectToArray'), $data);
        }

        return $data;
    }
}
0
Loren