Konvertieren Sie das stdClass-Objekt in ein Array in PHP


108

Ich hole post_id von postmeta als:

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

Wenn ich es versuche, habe print_r($post_id); ich ein Array wie dieses:

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

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

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

)

und ich weiß nicht, wie ich es durchqueren soll und wie ich ein Array wie dieses bekommen könnte

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

Irgendeine Idee, wie ich das machen kann?


2
Mögliches Duplikat von php stdClass zu Array
mvladk

Antworten:


244

Am einfachsten ist es, Ihr Objekt per JSON zu codieren und dann wieder in ein Array zu decodieren:

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

Wenn Sie möchten, können Sie das Objekt auch manuell durchlaufen:

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

1
Warum können wir das nicht einfach tun $array = json_decode($object,true)?
Akshaynagpal

3
@akshaynagpal: Dies würde zu einem Fehler führen, da Sie einer Funktion, die eine JSON-Zeichenfolge als Eingabe erwartet, ein Objekt zuweisen. In der Antwort konvertiere ich das Objekt in eine JSON-Zeichenfolge und füge es dann als Eingabe in json_decode () ein, damit es ein Array zurückgibt (der zweite Parameter als True gibt an, dass ein Array zurückgegeben werden soll).
Amal Murali

6
Ich weiß, es ist zu spät, aber warum Sie nicht Typ Casting verwenden ... (Array) $ obj
chhameed

Ich fand json_decode(json_encode($object), True)ein anderes Array als die foreach-Schleife. Die foreach-Schleife gibt das Array in dem gewünschten Format OP zurück.
user3442612

1
@NgSekLong: Nicht wirklich, nein.
Amal Murali

60

Ganz einfach: Verwandeln Sie Ihr Objekt zuerst in ein JSON-Objekt. Dadurch wird eine Zeichenfolge Ihres Objekts an einen JSON-Vertreter zurückgegeben.

Nehmen Sie dieses Ergebnis und dekodieren Sie es mit einem zusätzlichen Parameter von true, wo es in ein assoziatives Array konvertiert wird

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

Das Problem liegt bei Werten, die nicht json-codierbar oder nicht standardisiert sind, d. H. Termine.
Kangur

20

Versuche dies:

$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
Perfekte Funktion, um das stdobject in Array zu ändern
Vivek

16

Sie können ein Standardobjekt wie folgt in ein Array konvertieren:

$objectToArray = (array)$object;

1
Das ist großartig, aber es konvertiert nur das erste Level. Wenn Sie eine Verschachtelung haben, müssen Sie dies für alle Knoten tun.
Ivan Carosati

7

Für eindimensionale Arrays:

$array = (array)$class; 

Für mehrdimensionales Array:

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

5
Willkommen bei SO. Würde es Ihnen etwas ausmachen, Ihre Antwort ein wenig zu erweitern, um zu erklären, wie das Problem gelöst wird?
Gung - Reinstate Monica

Für eindimensionale Arrays: $ array = (array) $ class; Für mehrdimensionales Array: Code von oben
Stapelüberlauf

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

ARRAY_A ist ein Argument "output_type". Es kann eine von vier vordefinierten Konstanten sein (standardmäßig 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.  

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


Dies ist der einzige vorgeschlagene Weg in der WordPress-Welt.
Raptor

6

Beim Konvertieren eines STD-Klassenobjekts in ein Array. Übertragen Sie das Objekt mithilfe der Array- Funktion von PHP in ein Array .

Probieren Sie es mit folgendem Code-Snippet aus.

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

Dadurch wird das äußere Objekt in ein Array konvertiert. Wenn jedoch eine der Eigenschaften auch Objekte sind, werden sie nicht konvertiert.
Coleman

Gemäß der Frage des OP hat er eine Ebene der Objektstruktur. Für die nächsten Level müssen Sie eine weitere foreach-Schleife hinzufügen.
NJInamdar

3

Sie können dies versuchen:

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

1

Verwenden Sie das ArrayObject von Std oder erstellen Sie Ihr eigenes

(neues \ ArrayObject ($ existierendeStdClass))

Sie können die eingebaute Methode für die neue Klasse verwenden:

getArrayCopy ()

oder übergeben Sie das neue Objekt an

iterator_to_array


Wenn $existingStdClasseine Eigenschaft eine andere stdClassist, bleibt diese Eigenschaft eine stdClass im resultierenden Array. Wenn Sie etwas benötigen, das rekursiv funktioniert, müssen Sie anscheinend die JSON-Techniken verwenden
Patrick

1

Nehmen wir an, $ post_id ist ein Array von $ item

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

starker Text


1

Wenn Sie ein Array haben und das Array-Element ein Element ist stdClass, ist dies die Lösung:

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

Jetzt wurde das stdClassdurch ein Array innerhalb des Arrays als neues Array-Element ersetzt


1

Es gibt zwei einfache Möglichkeiten, das stdClass-Objekt in ein Array zu konvertieren

$array = get_object_vars($obj);

und andere ist

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

oder Sie können einfach ein Array mit foreach loop erstellen

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

0

Ich habe eine Funktion, myOrderId($_GET['ID']);die mehrdimensionales OBJ zurückgibt. als String .

Keiner der anderen 1 Liner hat für mich gewirkt.

Dies funktionierte beide:

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

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.