Як перетворити об’єкт у масив?


204
<?php
   print_r($response->response->docs);
?>

Виходить наступне:

    Array 
(
    [0] => Object 
            (
                [_fields:private] => Array 
                                    (
                                        [id]=>9093 
                                        [name]=>zahir
                                    ) 
            Object 
            ( 
                [_fields:private] => Array 
                                    (
                                        [id]=>9094 
                                        [name]=>hussain
                                    )..
            )
)

Як я можу перетворити цей об’єкт у масив? Я хочу вивести наступне:

Array
(
    [0]=>
    (
        [id]=>9093 
        [name]=>zahir
    ) 
    [1]=>
    (
        [id]=>9094 
        [name]=>hussain
    )...
)

Чи можливо це?

Відповіді:


133

Ви повинні подивитися на get_object_vars , оскільки ваші властивості оголошені приватними, ви повинні викликати це всередині класу та повертати його результати.

Будьте уважні, для примітивних типів даних, таких як рядки, це буде чудово, але я не знаю, як він поводиться з вкладеними об'єктами.

у вашому випадку ви повинні зробити щось на кшталт;

<?php
   print_r(get_object_vars($response->response->docs));
?>

385

Одновимірні масиви

Для перетворення одновимірних масивів ви можете подавати, використовуючи (array)або є get_object_vars, про що Бенуа згадував у своїй відповіді .

// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);

Вони працюють трохи відрізняються один від одного. Наприклад, get_object_varsповерне масив із лише загальнодоступними властивостями, якщо він не викликається з-за обсягу об'єкта, який ви передаєте (тобто у функції-члена об'єкта). (array)з іншого боку, буде передано до масиву з усіма публічними, приватними та захищеними членами, неушкодженими у масиві, хоча, звичайно, усі загальні зараз.

Багатовимірні масиви

Дещо брудним методом є використання PHP> = 5.2 вбудованих функцій JSON для кодування до JSON, а потім декодування назад до масиву. Однак це не стосуватиметься приватних та захищених членів і не підходить для об'єктів, які містять дані, які не можуть бути закодовані JSON (наприклад, двійкові дані).

// The second parameter of json_decode forces parsing into an associative array
$array = json_decode(json_encode($object), true);

Крім того, наступна функція перетворить з об'єкта в масив, що включає приватні та захищені члени, взяті звідси та змінені для використання кастингу:

function objectToArray ($object) {
    if(!is_object($object) && !is_array($object))
        return $object;

    return array_map('objectToArray', (array) $object);
}

5
Перше рішення не вирішувало взаємних розмірів, але друге рішення працювало чудово.
sbuck

1
2-е рішення нагадало мені, що є 2-й параметр json_decode (), який я забув .. дякую.
Тайлер

1
Цікаво, чому ця відповідь набирає стільки голосів. Обидва рішення менш чіткі та гарні, ніж get_object_vars
RJD22,

3
@ RJD22: Я оновив свою відповідь, щоб зробити її більш «фактичним» ресурсом, сподіваюся, ви вважаєте її гідною її голосів зараз. ;-) Зауважте всім, що тут йдеться про коментарі, що стосуються "другого рішення" - це рішення JSON, яке було моїм першою відповіддю 2-м.
Енді Е

ДУЖЕ! Я був вражений рішенням і прокрутився вниз, щоб знайти це!
eozzy

44

Ви можете швидко перетворити глибоко вкладені об'єкти в асоціативні масиви, спираючись на поведінку функцій кодування / декодування JSON:

$array = json_decode(json_encode($response->response->docs), true);

2
Це найпростіша відповідь на цю проблему. Використовували його, і це спрацювало приголомшливо. Спасибі
Дастін Фракер

7
Просто зауваження - це спрацює у випадку, якщо ваш масив містить дійсні дані UTF8. Якщо ваш масив містить якесь інше кодування, скажімо, Win1250, воно вийде з ладу, оскільки json_encode вийде з ладу (php 5.3)
Radek

Як перетворити його назад на об’єкт?
Pmpr

@Trix знову використовує json json_decode (json_encode ($ масив), FALSE); Це також (рекурсивно) перетворює всі ваші підмасиви в об'єкти,
Mufaddal

Я б хотів, щоб я міг підкреслити це не раз.
JohnFF

34

Обережно:

$array = (array) $object;

робить неглибоке перетворення ($ object-> innerObject = new stdClass () залишається об'єктом) і перетворює назад і назад за допомогою json працює, але це не дуже добре, якщо продуктивність є проблемою.

Якщо вам потрібні всі об'єкти для перетворення в асоціативні масиви, тут є кращий спосіб зробити це (код, зірваний з я не пам'ятаю, звідки):

function toArray($obj)
{
    if (is_object($obj)) $obj = (array)$obj;
    if (is_array($obj)) {
        $new = array();
        foreach ($obj as $key => $val) {
            $new[$key] = toArray($val);
        }
    } else {
        $new = $obj;
    }

    return $new;
}

Я не можу прочитати масив у результаті кастингу об'єкта: codepad.viper-7.com/AkX5pq Чи є у вас пояснення з цього приводу?
Дамієн

1
Мені найбільше подобається ця відповідь. Рекурсивна функція Енді Е по суті робить те саме, але мені це легше зрозуміти.
HartleySan

20
$array = json_decode(json_encode($object), true);

Я спробував декілька способів зробити foreachоб’єкт, і ЦЕ дійсно є найпростішим і найкрутішим вирішенням, яке я бачив. Всього один рядок :)


Він ідеально підходить лише з публічними атрибутами об'єктів. Не вважає приватними.
Лімон

Ось кілька пояснень щодо використання функції JsonSerialize, але це не одне рядкове рішення, і я читав про це не є хорошою практикою :( stackoverflow.com/questions/7005860/… . Дякую за пораду.
m3nda

Як перетворити його назад на об’єкт?
Pmpr

18

Проста версія:

$arrayObject = new ArrayObject($object);
$array = $arrayObject->getArrayCopy();

Оновлена ​​рекурсивна версія:

class RecursiveArrayObject extends ArrayObject
{
    function getArrayCopy()
    {
        $resultArray = parent::getArrayCopy();
        foreach($resultArray as $key => $val) {
            if (!is_object($val)) {
                continue;
            }
            $o = new RecursiveArrayObject($val);
            $resultArray[$key] = $o->getArrayCopy();
        }
        return $resultArray;
    }
}

$arrayObject = new RecursiveArrayObject($object);
$array = $arrayObject->getArrayCopy();

2

Спробуйте це:-

 <?php
  print_r(json_decode(json_encode($response->response->docs),true));
 ?>

2

У мене була така ж проблема, і я вирішив її за допомогою вказаних вище get_object_vars .

Крім того, мені довелося перетворити мій об'єкт за допомогою json_decode, і мені довелося повторити масив з циклом oldschool "for" (а не для кожного).


0

Ви також можете використовувати метод array_values ​​() php


2
Ви не можете. “Array_values ​​() очікує, що параметр 1 буде масивом, заданий об’єкт”.
манатура

0

Я зіткнувся з проблемою з відповіддю Енді Ерншоу, тому що я розробив цю функцію в окремий клас у моїй програмі "HelperFunctions", що означало, що рекурсивний виклик до objectToArray () не вдався.

Я подолав це, вказавши ім'я класу у виклику array_map так:

public function objectToArray($object) {
    if (!is_object($object) && !is_array($object))
        return $object;
    return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
}

Я б написав це в коментарях, але ще не маю достатньої репутації.


-2
//My Function is worked. Hope help full for you :)
      $input = [
            '1' => (object) [1,2,3],
            '2' => (object) [4,5,6,
                (object) [6,7,8,
                [9, 10, 11,
                    (object) [12, 13, 14]]]
            ],
            '3' =>[15, 16, (object)[17, 18]]
        ];

        echo "<pre>";
        var_dump($input);
        var_dump(toAnArray($input));

      public function toAnArray(&$input) {

        if (is_object($input)) {
            $input = get_object_vars($input);
        }
        foreach ($input as &$item) {
            if (is_object($item) || is_array($item)) {
                if (is_object($item)) {
                    $item = get_object_vars($item);
                }
                self::toAnArray($item);
            }
        }
    }

ваша функція нічого не повертає. немає способу це працювати!
Rotimi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.