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" } }
после того, как 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;
}
}
Ответы
Ответ 1
Ленточный однострочный метод
Вы можете сделать это в одном лайнере, используя методы 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);
Ответ 2
используйте эту функцию, чтобы получить стандартный массив после того типа, который вы после...
return get_object_vars($booking);
Ответ 3
Поскольку это массив перед тем, как вы его произнесете, его использование не имеет смысла.
Вам может понадобиться рекурсивный листинг, который будет выглядеть примерно так:
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.
Ответ 4
Пожалуйста, используйте следующую функцию php для преобразования php stdClass в массив
get_object_vars($data)
Ответ 5
Эта функция работала для меня:
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/
Ответ 6
Просто просмотрел его и нашел здесь удобную функцию, которая полезна для преобразования объекта 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;
}
}
?>
РЕДАКТИРОВАТЬ: я обновил этот ответ с помощью контента из связанного источника (который также изменился сейчас), благодаря mason81, который предлагает мне.
Ответ 7
Используйте встроенную функцию приведения типов, просто введите
$realArray = (array)$stdClass;
Ответ 8
Вот версия ответа Carlo, которая может быть использована в классе:
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;
}
}
Ответ 9
Следующий код будет читать все электронные письма и печатать тему, тело и дату.
<?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
Пробираясь с различными предложениями, я использовал проб и ошибок, чтобы придумать это решение. Надеюсь, что это поможет.