Konwertuj obiekt stdClass na tablicę w PHP


108

Pobieram post_id z postmeta jako:

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

kiedy próbuję print_r($post_id); , mam taką tablicę:

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

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

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

)

i nie wiem, jak to przejść, i jak mogę uzyskać taką tablicę

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

Masz jakiś pomysł, jak mogę to zrobić?


2
Możliwy duplikat php stdClass do tablicy
mvladk

Odpowiedzi:


244

Najłatwiejszym sposobem jest zakodowanie obiektu w formacie JSON, a następnie dekodowanie go z powrotem do tablicy:

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

Jeśli wolisz, możesz też przejść przez obiekt ręcznie:

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

1
Dlaczego nie możemy po prostu zrobić $array = json_decode($object,true)?
akshaynagpal

3
@akshaynagpal: Spowodowałoby to błąd, ponieważ przekazujesz obiekt funkcji, która oczekuje ciągu JSON jako wejścia. W odpowiedzi konwertuję obiekt na ciąg JSON, a następnie podaję go jako dane wejściowe do json_decode (), aby zwrócił tablicę (drugi parametr, który ma wartość True, wskazuje, że tablica powinna zostać zwrócona).
Amal Murali

6
Wiem, że jest za późno, ale dlaczego nie używasz rzutowania typów ... (tablica) $ obj
chhameed

Okazało się, że json_decode(json_encode($object), True)zwrócił inną tablicę w porównaniu do pętli foreach. Pętla foreach zwraca tablicę w żądanym formacie OP.
user3442612

1
@NgSekLong: Niezupełnie, nie.
Amal Murali

60

Bardzo proste, najpierw zamień swój obiekt w obiekt json, to zwróci ciąg twojego obiektu do reprezentanta JSON.

Weź ten wynik i zdekoduj z dodatkowym parametrem true, gdzie zostanie przekonwertowany na tablicę asocjacyjną

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

Problem polega na tym, że wartości, które nie są kodowane w json lub nie są znormalizowane, tj. Daktyle.
Kangur,

20

Spróbuj tego:

$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
Doskonała funkcja do zmiany obiektu standardowego na tablicę
Vivek

16

Możesz przekonwertować obiekt std na tablicę w następujący sposób:

$objectToArray = (array)$object;

1
To jest świetne, ale konwertuje tylko pierwszy poziom. Jeśli masz zagnieżdżanie, musisz to zrobić dla wszystkich węzłów.
Ivan Carosati

7

W przypadku tablic jednowymiarowych:

$array = (array)$class; 

W przypadku tablicy wielowymiarowej:

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

5
Witamy w SO. Czy mógłbyś nieco rozszerzyć swoją odpowiedź, aby wyjaśnić, jak rozwiązuje ona problem?
gung - Przywróć Monikę

Dla tablic jednowymiarowych: $ tablica = (tablica) $ klasa; Dla tablicy wielowymiarowej: kod z góry
przepełnienie stosu,

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

ARRAY_A jest argumentem „typ_wyjścia”. Może to być jedna z czterech predefiniowanych stałych (domyślnie 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.  

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


to jedyny sugerowany sposób w świecie WordPress.
Raptor

6

Podczas konwertowania obiektu klasy STD na array Cast obiektu do tablicy przy użyciu funkcji tablicowej php.

Wypróbuj z następującym fragmentem kodu.

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

Spowoduje to przekonwertowanie obiektu zewnętrznego na tablicę, ale jeśli którakolwiek z właściwości jest również obiektami, nie zostanie przekonwertowana.
Coleman

Zgodnie z pytaniem PO ma jeden poziom struktury obiektu. Na kolejnych poziomach musisz dodać kolejną pętlę foreach.
NJInamdar

3

Możesz spróbować tego:

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

1

Korzystanie z ArrayObject z Std lub tworzenie własnych

(nowy \ ArrayObject ($ existingStdClass))

możesz użyć metody wbudowanej w nowej klasie:

getArrayCopy ()

lub przekaż nowy obiekt do

iterator_to_array


Jeśli $existingStdClassma inną właściwość, stdClasswówczas ta właściwość pozostaje stdClass w wynikowej tablicy. Jeśli potrzebujesz czegoś, co działa rekurencyjnie, wydaje się, że musisz użyć technik json
Patrick

1

Załóżmy, że $ post_id to tablica $ item

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

mocny tekst


1

jeśli masz tablicę i element tablicy to stdClassitem, to jest rozwiązanie:

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

teraz stdClasszostała zastąpiona tablicą wewnątrz tablicy jako nowy element tablicy


1

Istnieją dwa proste sposoby konwersji obiektu stdClass na tablicę

$array = get_object_vars($obj);

a inny jest

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

lub możesz po prostu utworzyć tablicę za pomocą pętli foreach

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

0

Mam funkcję, myOrderId($_GET['ID']);która zwraca wielowymiarowy OBJ. jako ciąg .

Żaden inny 1 liniowiec nie działał dla mnie.

Oba działały:

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

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.