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?

Dinesh
quelle
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;
Amal Murali
quelle
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);
Rey Ramos
quelle
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;
    }
}
Alessandro Minoccheri
quelle
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;
Dinesh Kaswan
quelle
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;
}
Paketüberfluss
quelle
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

Vlad
quelle
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 );
NJInamdar
quelle
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);
Sajuna Fernando
quelle
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

Decebal
quelle
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

Varun Sharma
quelle
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

Softnwords
quelle
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);
Tayyab Hayat
quelle
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);
Cyborg
quelle