แปลงวัตถุ stdClass เป็นอาร์เรย์ใน PHP


108

ฉันดึง post_id จาก postmeta เป็น:

$post_id = $wpdb->get_results("SELECT post_id FROM $wpdb->postmeta WHERE (meta_key = 'mfn-post-link1' AND meta_value = '". $from ."')");

เมื่อฉันลองprint_r($post_id); มีอาร์เรย์ดังนี้:

Array
(
    [0] => stdClass Object
        (
            [post_id] => 140
        )

    [1] => stdClass Object
        (
            [post_id] => 141
        )

    [2] => stdClass Object
        (
            [post_id] => 142
        )

)

และฉันไม่รู้ว่าจะสำรวจมันอย่างไรและฉันจะได้อาร์เรย์แบบนี้ได้อย่างไร

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

ฉันจะทำสิ่งนี้ได้อย่างไร?


2
เป็นไปได้ว่าphp stdClass ซ้ำกับอาร์เรย์
mvladk

คำตอบ:


244

วิธีที่ง่ายที่สุดคือการเข้ารหัส JSON ของคุณแล้วถอดรหัสกลับเป็นอาร์เรย์:

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

หรือหากต้องการคุณสามารถสำรวจวัตถุด้วยตนเองได้เช่นกัน:

foreach ($object as $value) 
    $array[] = $value->post_id;

1
ทำไมเราทำ$array = json_decode($object,true)ไม่ได้?
akshaynagpal

3
@akshaynagpal: จะส่งผลให้เกิดข้อผิดพลาดเนื่องจากคุณจะให้อ็อบเจ็กต์กับฟังก์ชันที่คาดว่าสตริง JSON เป็นอินพุต ในคำตอบฉันกำลังแปลงอ็อบเจ็กต์เป็นสตริง JSON จากนั้นป้อนเป็นอินพุตไปยัง json_decode () ดังนั้นมันจะส่งคืนอาร์เรย์ (พารามิเตอร์ที่สองเป็น True บ่งชี้ว่าควรส่งคืนอาร์เรย์)
Amal Murali

6
ฉันรู้ว่ามันสายเกินไป แต่ทำไมคุณไม่ใช้ type casting ... (array) $ obj
chhameed

ฉันพบว่าjson_decode(json_encode($object), True)มีอาร์เรย์ที่แตกต่างกันเมื่อเทียบกับ foreach loop foreach loop ส่งคืนอาร์เรย์ในรูปแบบที่ OP ขอ
user3442612

1
@NgSekLong: ไม่จริงไม่
Amal Murali

60

ง่ายมากขั้นแรกเปลี่ยนวัตถุของคุณให้เป็นวัตถุ json สิ่งนี้จะส่งคืนสตริงของวัตถุของคุณเป็นตัวแทน JSON

รับผลลัพธ์นั้นและถอดรหัสด้วยพารามิเตอร์พิเศษของ true ซึ่งจะแปลงเป็น Associative array

$array = json_decode(json_encode($oObject),true);

ปัญหาคือค่าที่ไม่สามารถเข้ารหัส json หรือไม่ได้มาตรฐานเช่น วันที่.
Kangur

20

ลองสิ่งนี้:

$new_array = objectToArray($yourObject);

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
ฟังก์ชันที่สมบูรณ์แบบในการเปลี่ยน stdobject เป็น array
Vivek

16

คุณสามารถแปลงวัตถุ std เป็นอาร์เรย์ได้ดังนี้:

$objectToArray = (array)$object;

1
นี่เป็นเรื่องที่ดี แต่จะแปลงเฉพาะระดับแรกเท่านั้น หากคุณมีการทำรังคุณต้องทำสำหรับโหนดทั้งหมด
Ivan Carosati

7

สำหรับอาร์เรย์หนึ่งมิติ:

$array = (array)$class; 

สำหรับอาร์เรย์หลายมิติ:

function stdToArray($obj){
  $reaged = (array)$obj;
  foreach($reaged as $key => &$field){
    if(is_object($field))$field = stdToArray($field);
  }
  return $reaged;
}

5
ยินดีต้อนรับสู่ SO คุณช่วยขยายคำตอบของคุณเล็กน้อยเพื่ออธิบายวิธีแก้ปัญหาหรือไม่
gung - คืนสถานะ Monica

สำหรับอาร์เรย์หนึ่งมิติ: $ array = (array) $ class; สำหรับอาร์เรย์หลายมิติ: โค้ดจากด้านบน
Stack Overflow

6
$wpdb->get_results("SELECT ...", ARRAY_A);

ARRAY_A คืออาร์กิวเมนต์ "output_type" สามารถเป็นค่าคงที่ที่กำหนดไว้ล่วงหน้าหนึ่งในสี่ค่า (ค่าเริ่มต้นคือ OBJECT):

OBJECT - result will be output as a numerically indexed array of row objects.
OBJECT_K - result will be output as an associative array of row objects, using first columns values as keys (duplicates will be discarded).
ARRAY_A - result will be output as an numerically indexed array of associative arrays, using column names as keys.
ARRAY_N - result will be output as a numerically indexed array of numerically indexed arrays.  

ดู: http://codex.wordpress.org/Class_Reference/wpdb


นี่เป็นวิธีเดียวที่แนะนำในโลกของ WordPress
Raptor

6

ในขณะที่แปลงวัตถุคลาส STD เป็นอาร์เรย์ส่งวัตถุไปยังอาร์เรย์โดยใช้อาร์เรย์ฟังก์ชันของ php

ลองใช้ข้อมูลโค้ดต่อไปนี้

/*** cast the object ***/    
foreach($stdArray as $key => $value)
{
    $stdArray[$key] = (array) $value;
}   
/*** show the results ***/  
print_r( $stdArray );

สิ่งนี้จะแปลงวัตถุภายนอกเป็นอาร์เรย์ แต่ถ้าคุณสมบัติใด ๆ เป็นวัตถุด้วยก็จะไม่ถูกแปลง
Coleman

ตามคำถามของ OP เขามีโครงสร้างวัตถุหนึ่งระดับ สำหรับระดับถัดไปคุณต้องเพิ่ม foreach loop อีกอัน
NJInamdar

3

คุณสามารถลองสิ่งนี้:

$aInitialArray = array_map(function($oObject){
    $aConverted = get_object_vars($oObject);
    return $aConverted['post_id'];
}, $aInitialArray);

1

ใช้ ArrayObject จาก Std หรือสร้างของคุณเอง

(ใหม่ \ ArrayObject ($ existingStdClass))

คุณสามารถใช้วิธีการสร้างในคลาสใหม่:

getArrayCopy ()

หรือส่งต่อวัตถุใหม่ไปที่

iterator_to_array


ถ้า$existingStdClassมีคุณสมบัติที่เป็นอื่นstdClassคุณสมบัตินั้นจะยังคงเป็น stdClass ในอาร์เรย์ผลลัพธ์ หากคุณต้องการบางสิ่งที่ใช้งานได้ซ้ำ ๆ ดูเหมือนว่าคุณต้องใช้เทคนิค json
Patrick

1

สมมติว่า $ post_id เป็นอาร์เรย์ของ $ item

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

ข้อความที่ชัดเจน


1

หากคุณมีอาร์เรย์และองค์ประกอบอาร์เรย์เป็นstdClassรายการนี่คือทางออก:

foreach($post_id as $key=>$item){
    $post_id[$key] = (array)$item;
}

ตอนนี้stdClassถูกแทนที่ด้วยอาร์เรย์ภายในอาร์เรย์เป็นองค์ประกอบอาร์เรย์ใหม่


1

มีสองวิธีง่ายๆในการแปลง stdClass Object เป็น Array

$array = get_object_vars($obj);

และอื่น ๆ คือ

$array = json_decode(json_encode($obj), true);

หรือคุณสามารถสร้างอาร์เรย์โดยใช้ foreach loop

$array = array();
foreach($obj as $key){
    $array[] = $key;
}
print_r($array);

0

ฉันมีฟังก์ชันmyOrderId($_GET['ID']);ที่ส่งคืน OBJ หลายมิติ เป็นสตริงสตริง

ไม่มีอีก 1 ซับที่ปลุกให้ฉัน

ทั้งสองอย่างนี้ใช้ได้ผล:

$array = (array)json_decode(myOrderId($_GET['ID']), True);

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.