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.