Chuyển đổi đối tượng stdClass thành mảng trong PHP


108

Tôi tìm nạp post_id từ postmeta dưới dạng:

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

khi tôi thử, print_r($post_id); tôi có mảng như thế này:

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

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

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

)

và tôi không biết làm thế nào để vượt qua nó, và làm thế nào tôi có thể có được mảng như thế này

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

Bất kỳ ý tưởng làm thế nào tôi có thể làm điều này?


2
Có thể có bản sao của php stdClass thành mảng
mvladk

Câu trả lời:


244

Cách dễ nhất là mã hóa JSON đối tượng của bạn và sau đó giải mã nó trở lại một mảng:

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

Hoặc nếu muốn, bạn cũng có thể duyệt đối tượng theo cách thủ công:

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

1
Tại sao chúng ta không thể làm $array = json_decode($object,true)?
akshaynagpal,

3
@akshaynagpal: Nó sẽ dẫn đến lỗi vì bạn sẽ đưa một đối tượng cho một hàm yêu cầu một chuỗi JSON làm đầu vào của nó. Trong câu trả lời, tôi đang chuyển đổi đối tượng thành một chuỗi JSON và sau đó cấp nó làm đầu vào cho json_decode () để nó sẽ trả về một mảng (tham số thứ hai là True cho biết một mảng nên được trả về).
Amal Murali

6
tôi biết nó quá muộn, nhưng tại sao bạn không sử dụng loại đúc ... (mảng) $ obj
chhameed

Tôi thấy đã json_decode(json_encode($object), True)trả về một mảng khác so với vòng lặp foreach. Vòng lặp foreach trả về mảng ở định dạng OP yêu cầu.
user3442612 13/09/2016

1
@NgSekLong: Không hẳn, không.
Amal Murali

60

Rất đơn giản, trước tiên hãy biến đối tượng của bạn thành một đối tượng json, điều này sẽ trả về một chuỗi đối tượng của bạn thành một đại diện JSON.

Lấy kết quả đó và giải mã với một tham số bổ sung là true, nơi nó sẽ chuyển đổi thành mảng kết hợp

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

Vấn đề là với các giá trị không thể mã hóa json hoặc không được chuẩn hóa, tức là. ngày.
Kangur

20

Thử cái này:

$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
Chức năng hoàn hảo để thay đổi stdobject để mảng
Vivek

16

Bạn có thể chuyển đổi một đối tượng std thành mảng như thế này:

$objectToArray = (array)$object;

1
Điều này là tuyệt vời, nhưng nó chỉ chuyển đổi cấp độ đầu tiên. Nếu bạn có lồng nhau, bạn phải làm điều đó cho tất cả các nút.
Ivan Carosati

7

Đối với mảng một chiều:

$array = (array)$class; 

Đối với mảng đa chiều:

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

5
Chào mừng đến với SO. Bạn có thể mở rộng câu trả lời của mình một chút để giải thích cách nó giải quyết vấn đề không?
gung - Khôi phục Monica

Đối với mảng một chiều: $ array = (array) $ class; Đối với mảng đa chiều: Mã từ trên cao
Stack Overflow

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

ARRAY_A là một đối số "output_type". Nó có thể là một trong bốn hằng số được xác định trước (mặc định là 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.  

Xem: http://codex.wordpress.org/Class_Reference/wpdb


đây là cách duy nhất được đề xuất trong thế giới WordPress.
Raptor

6

Trong khi chuyển đổi một đối tượng lớp STD thành mảng. Chuyển đối tượng thành mảng bằng cách sử dụng hàm mảng của php.

Hãy thử với đoạn mã sau.

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

Điều này sẽ chuyển đổi đối tượng bên ngoài thành một mảng, nhưng nếu bất kỳ thuộc tính nào cũng là đối tượng thì chúng sẽ không được chuyển đổi.
Coleman

Theo câu hỏi của OP, anh ta có một cấp độ của cấu trúc đối tượng. Đối với các cấp độ tiếp theo, bạn phải thêm một vòng lặp foreach khác.
NJInamdar

3

Bạn có thể thử điều này:

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

1

Sử dụng ArrayObject từ Std hoặc xây dựng của riêng bạn

(new \ ArrayObject ($ currentStdClass))

bạn có thể sử dụng phương thức xây dựng trong lớp mới:

getArrayCopy ()

hoặc chuyển đối tượng mới tới

iterator_to_array


Nếu $existingStdClasscó một thuộc tính là một thuộc tính khác stdClassthì thuộc tính đó vẫn là một stdClass trong mảng kết quả. Nếu bạn cần thứ gì đó hoạt động đệ quy thì có vẻ như bạn cần sử dụng các kỹ thuật json
Patrick

1

Giả sử $ post_id là mảng $ item

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

văn bản mạnh mẽ


1

nếu bạn có một mảng và phần tử mảng là stdClassmục thì đây là giải pháp:

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

bây giờ stdClassđã được thay thế bằng một mảng bên trong mảng dưới dạng phần tử mảng mới


1

Có hai cách đơn giản để chuyển đổi Đối tượng stdClass thành Mảng

$array = get_object_vars($obj);

và khác là

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

hoặc bạn có thể chỉ cần tạo mảng bằng vòng lặp foreach

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

0

Tôi có một hàm myOrderId($_GET['ID']);trả về OBJ nhiều chiều. như một chuỗi .

Không có 1 lớp lót nào khác phù hợp với tôi.

Cả hai điều này đều hoạt động:

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

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
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.