Làm thế nào để tôi chuyển đổi một đối tượng thành một mảng?


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

Đầu ra như sau:

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

Làm thế nào tôi có thể chuyển đổi đối tượng này thành một mảng? Tôi muốn xuất ra như sau:

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

Điều này có thể không?

Câu trả lời:


133

Bạn nên xem get_object_vars , vì các thuộc tính của bạn được khai báo là riêng tư, bạn nên gọi nó trong lớp và trả về kết quả của nó.

Hãy cẩn thận, đối với các kiểu dữ liệu nguyên thủy như chuỗi, nó sẽ hoạt động rất tốt, nhưng tôi không biết nó hoạt động như thế nào với các đối tượng lồng nhau.

trong trường hợp của bạn, bạn phải làm một cái gì đó như;

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

385

Mảng một chiều

Để chuyển đổi các mảng một chiều, bạn có thể sử dụng (array)hoặc có get_object_vars, mà Benoit đã đề cập trong câu trả lời của mình .

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

Họ làm việc hơi khác nhau. Ví dụ, get_object_varssẽ trả về một mảng chỉ có các thuộc tính có thể truy cập công khai trừ khi nó được gọi từ trong phạm vi của đối tượng bạn đi qua (nghĩa là trong một hàm thành viên của đối tượng). (array)mặt khác, sẽ chuyển sang một mảng với tất cả các thành viên công khai, riêng tư và được bảo vệ nguyên vẹn trên mảng, mặc dù tất cả công khai bây giờ, tất nhiên.

Mảng đa chiều

Một phương pháp hơi bẩn là sử dụng các hàm JSON gốc của PHP> = 5.2 để mã hóa thành JSON và sau đó giải mã trở lại một mảng. Tuy nhiên, điều này sẽ không bao gồm các thành viên riêng tư và được bảo vệ và không phù hợp với các đối tượng chứa dữ liệu không thể được mã hóa JSON (như dữ liệu nhị phân).

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

Ngoài ra, chức năng sau đây sẽ chuyển đổi từ một đối tượng thành một mảng bao gồm các thành viên riêng tư và được bảo vệ, được lấy từ đây và sửa đổi để sử dụng truyền:

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

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

5
Giải pháp đầu tiên không xử lý đột biến, nhưng giải pháp thứ hai hoạt động rất tốt.
sbuck

1
Giải pháp thứ 2 nhắc nhở tôi rằng có một tham số thứ 2 cho json_decode () mà tôi đã quên .. cảm ơn.
Tyler

1
Tôi tự hỏi tại sao câu trả lời này nhận được nhiều phiếu bầu. Cả hai giải pháp đều không rõ ràng và đẹp hơn get_object_vars
RJD22

3
@ RJD22: Tôi đã cập nhật câu trả lời của mình để biến nó thành tài nguyên 'thực tế hơn', hy vọng bạn coi nó là xứng đáng với số phiếu bầu của mình ngay bây giờ. ;-) Lưu ý với mọi người rằng "giải pháp thứ 2" mà các bình luận đề cập ở đây là giải pháp JSON, là giải pháp thứ 2 trong câu trả lời đầu tiên của tôi.
Andy E

TUYỆT VỜI! Tôi đã rất ngạc nhiên bởi một giải pháp và cuộn xuống để tìm thấy điều này!
eozzy

44

Bạn có thể nhanh chóng chuyển đổi các đối tượng được lồng sâu vào các mảng kết hợp bằng cách dựa vào hành vi của các hàm mã hóa / giải mã JSON:

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

2
Đây là câu trả lời đơn giản nhất cho vấn đề này. Sử dụng nó và nó làm việc tuyệt vời. Cảm ơn
Kẻ lừa đảo Dustin

7
Chỉ cần một lưu ý - điều này sẽ hoạt động trong trường hợp mảng của bạn chứa dữ liệu hợp lệ UTF8. Nếu mảng của bạn chứa một số mã hóa khác, giả sử Win1250, nó sẽ thất bại, vì json_encode sẽ thất bại (php 5.3)
Radek

Làm thế nào để chuyển đổi nó trở lại một đối tượng?
Pmpr

@Trix sử dụng json một lần nữa json_decode (json_encode ($ mảng), FALSE); Điều này cũng (đệ quy) chuyển đổi tất cả các mảng con của bạn thành các đối tượng,
Mufaddal

Tôi ước tôi có thể tiếp thu điều này nhiều hơn một lần.
JohnFF

34

Cẩn thận:

$array = (array) $object;

thực hiện chuyển đổi nông ($ object-> InternalObject = new stdClass () vẫn là một đối tượng) và chuyển đổi qua lại bằng cách sử dụng json nhưng không phải là ý hay nếu hiệu suất là một vấn đề.

Nếu bạn cần tất cả các đối tượng được chuyển đổi thành mảng kết hợp thì đây là cách tốt hơn để làm điều đó (mã được trích xuất từ ​​tôi không nhớ ở đâu):

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;
}

Tôi không thể đọc mảng kết quả của việc truyền đối tượng: codepad.viper-7.com/AkX5pq Bạn có lời giải thích nào về điều đó không?
Damien

1
Tôi thích câu trả lời này nhất. Hàm đệ quy của Andy E về cơ bản cũng làm điều tương tự, nhưng tôi thấy cái này dễ hiểu hơn.
HartleySan

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

Tôi đã thử một vài cách để làm foreachvới một đối tượng và đây thực sự là cách giải quyết dễ dàng và tuyệt vời nhất tôi từng thấy. Chỉ một dòng :)


Nó hoạt động hoàn hảo chỉ với các thuộc tính đối tượng công cộng. Không xem xét những người riêng tư.
Limon

Dưới đây là một số giải thích về việc sử dụng chức năng JsonSerialize, nhưng không phải là một giải pháp dòng và tôi đọc về nó không phải là một cách thực hành tốt :( stackoverflow.com/questions/7005860/ . Cảm ơn bạn đã cho lời khuyên.
m3nda

Làm thế nào để chuyển đổi nó trở lại một đối tượng?
Pmpr

18

Phiên bản đơn giản:

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

Cập nhật phiên bản đệ quy:

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

Thử cái này:-

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

2

Tôi đã có cùng một vấn đề và tôi đã giải quyết nó bằng get_object_vars đã đề cập ở trên.

Hơn nữa, tôi đã phải chuyển đổi đối tượng của mình bằng json_decode và tôi phải lặp lại mảng với vòng lặp "for" oldschool (thay vì sau đó cho mỗi).


0

Bạn cũng có thể sử dụng phương thức Array_values ​​() của php


2
Bạn không thể. Mảng Array_values ​​() dự kiến ​​tham số 1 sẽ là mảng, đối tượng được đưa ra.
thao tác

0

Tôi gặp phải vấn đề với câu trả lời của Andy Earnshaw vì tôi đã thực hiện chức năng này cho một lớp riêng trong ứng dụng của mình, "HelperFifts", có nghĩa là cuộc gọi đệ quy đến objectToArray () không thành công.

Tôi đã khắc phục điều này bằng cách chỉ định tên lớp trong lệnh gọi Array_map như vậy:

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

Tôi đã có thể viết điều này trong các ý kiến ​​nhưng tôi chưa có đủ danh tiếng.


-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);
            }
        }
    }

chức năng của bạn không trả lại bất cứ điều gì. không có cách nào nó hoạt động!
Rotimi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.