У меня проблема с преобразованием объекта 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" } }
после того, как cast пуст 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; } }
Вы можете сделать это в одном лайнере, используя методы JSON, если вы готовы потерять крошечную производительность (хотя некоторые сообщили, что это быстрее, чем повторение через объекты рекурсивно – скорее всего, из-за медленного функционирования PHP в вызывающих функциях ). « Но я уже сделал это », – говорите вы. Не совсем – вы использовали json_decode
в массиве, но сначала вам нужно закодировать его с помощью json_encode
.
Методы json_encode
и json_decode
. Они автоматически добавляются в PHP 5.2.0 и выше. Если вы используете какую-либо более старую версию, есть также библиотека PECL (в этом случае вы должны действительно обновить свою установку PHP. Поддержка 5.1 остановлена в 2006 году).
array
/ stdClass
-> stdClass
$stdClass = json_decode(json_encode($booking));
array
/ stdClass
-> array
Руководство задает второй аргумент json_decode
как:
ассоциативный
КогдаTRUE
, возвращенные объекты будут преобразованы в ассоциативные массивы.
Следовательно, следующая строка преобразует весь ваш объект в массив:
$array = json_decode(json_encode($booking), true);
используйте эту функцию, чтобы получить стандартный массив после того типа, который вы после …
return get_object_vars($booking);
Поскольку это массив до того, как вы его произнесете, литье его не имеет смысла.
Вам может понадобиться рекурсивная броска, которая будет выглядеть примерно так:
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.
Эта функция работала для меня:
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/
Пожалуйста, используйте следующую функцию php для преобразования php stdClass в массив
get_object_vars($data)
Просто запустил его в Google и нашел здесь удобную функцию, которая полезна для преобразования объекта 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 за предложение мне.
Вот вариант ответа Карло, который можно использовать в классе:
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; } }
Следующий код будет читать все письма и печатать тему, тело и дату.
<?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
Борясь с различными предложениями, я использовал пробную версию и ошибку, чтобы придумать это решение. Надеюсь, поможет.