ฉันจะแปลงวัตถุเป็นอาร์เรย์ได้อย่างไร


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)ในทางกลับกันก็จะส่งอาร์เรย์ไปยังสมาชิกสาธารณะภาคเอกชนและสมาชิกที่ได้รับความคุ้มครองเหมือนเดิม

อาร์เรย์หลายมิติ

วิธีที่ค่อนข้างสกปรกคือการใช้ฟังก์ชั่น JSON ดั้งเดิมของ PHP> = 5.2 เพื่อเข้ารหัสเป็น 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
ทางออกที่สองเตือนฉันว่ามีพารามิเตอร์ตัวที่สองเป็น json_decode () ซึ่งฉันลืม .. ขอบคุณ
ไทเลอร์

1
ฉันสงสัยว่าทำไมคำตอบนี้ได้รับการโหวตมากมาย โซลูชันทั้งสองมีความชัดเจนน้อยกว่าและสวยกว่า get_object_vars
RJD22

3
@ RJD22: ฉันได้อัปเดตคำตอบของฉันเพื่อให้เป็นทรัพยากร 'พฤตินัย' มากขึ้นหวังว่าคุณจะเห็นว่ามันคุ้มค่ากับการลงคะแนนในตอนนี้ ;-) หมายเหตุสำหรับคนอื่น ๆ ว่า "โซลูชั่นที่ 2" ความคิดเห็นที่อ้างถึงที่นี่คือโซลูชั่น JSON ซึ่งเป็นที่ 2 ในคำตอบแรกของฉัน
Andy E

น่ากลัว! ฉันประหลาดใจด้วยวิธีแก้ปัญหาและเลื่อนลงเพื่อค้นหาสิ่งนี้!
eozzy

44

คุณสามารถแปลงออบเจกต์ที่อยู่ลึกเข้าไปในอาเรย์แบบเชื่อมโยงได้อย่างรวดเร็วโดยอาศัยพฤติกรรมของฟังก์ชันการเข้ารหัส / ถอดรหัส JSON:

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

2
นี่เป็นคำตอบที่ง่ายที่สุดสำหรับปัญหานี้ ใช้มันและมันทำงานได้ยอดเยี่ยม ขอบคุณ
Dustin Fraker

7
เพิ่งทราบ - สิ่งนี้จะทำงานในกรณีที่อาร์เรย์ของคุณมีข้อมูลที่ถูกต้อง UTF8 หากอาร์เรย์ของคุณมีการเข้ารหัสอื่น ๆ สมมติว่า Win1250 มันจะล้มเหลวเนื่องจาก json_encode จะล้มเหลว (php 5.3)
Radek

จะแปลงกลับเป็นวัตถุได้อย่างไร?
2560

@Trix ใช้ json อีกครั้ง json_decode (json_encode ($ array), 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คุณมีคำอธิบายเกี่ยวกับเรื่องนี้ไหม?
Damien

1
ฉันชอบคำตอบนี้ดีที่สุด ฟังก์ชั่นวนซ้ำของ Andy E ทำสิ่งเดียวกัน แต่ฉันคิดว่ามันง่ายกว่าที่จะเข้าใจ
HartleySan

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

ฉันพยายามทำหลายสิ่งหลายอย่างforeachกับวัตถุและนี่เป็นวิธีที่ง่ายและดีที่สุดที่ฉันเคยเห็น แค่บรรทัดเดียว :)


มันทำงานได้สมบูรณ์แบบเฉพาะกับคุณลักษณะวัตถุสาธารณะ ไม่ถือว่าเป็นข้อมูลส่วนตัว
Limon

นี่คือคำอธิบายบางอย่างเกี่ยวกับการใช้ฟังก์ชั่น JsonSerialize แต่ไม่ใช่วิธีแก้ปัญหาสายเดียวและฉันอ่านเกี่ยวกับมันไม่ใช่วิธีปฏิบัติที่ดี :( stackoverflow.com/questions/7005860/
......

จะแปลงกลับเป็นวัตถุได้อย่างไร?
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

ฉันมีปัญหาเดียวกันและฉันแก้ไขด้วยget_object_vars ที่กล่าวถึงข้างต้น

นอกจากนี้ฉันต้องแปลงวัตถุของฉันด้วยjson_decodeและฉันต้องทำซ้ำอาร์เรย์ด้วย oldschool "for" loop (แทนแต่ละอัน)


0

คุณยังสามารถใช้วิธี array_values ​​() ของ php


2
คุณทำไม่ได้ “ array_values ​​() คาดว่าพารามิเตอร์ 1 จะเป็นอาร์เรย์วัตถุที่กำหนด”
จัดการ

0

ฉันพบปัญหากับคำตอบของ Andy Earnshaw เพราะฉันได้แยกฟังก์ชั่นนี้ออกเป็นคลาสแยกต่างหากในใบสมัครของฉัน "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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.