Convertir l'objet stdClass en tableau en PHP

108

Je récupère post_id de postmeta comme:

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

quand j'essaye, print_r($post_id); j'ai un tableau comme celui-ci:

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

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

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

)

et je ne sais pas comment le traverser, et comment pourrais-je obtenir un tableau comme celui-ci

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

Une idée comment puis-je faire cela?

Dinesh
la source
2
Possible duplication de php stdClass vers array
mvladk

Réponses:

244

Le moyen le plus simple consiste à encoder votre objet en JSON, puis à le décoder en un tableau:

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

Ou si vous préférez, vous pouvez également parcourir l'objet manuellement:

foreach ($object as $value) 
    $array[] = $value->post_id;
Amal Murali
la source
1
Pourquoi ne pouvons-nous pas simplement faire $array = json_decode($object,true)?
akshaynagpal
3
@akshaynagpal: Cela entraînerait une erreur car vous donnerez un objet à une fonction qui attend une chaîne JSON comme entrée. Dans la réponse, je convertis l'objet en une chaîne JSON, puis je le nourris comme entrée à json_decode () afin qu'il renvoie un tableau (le deuxième paramètre étant True indique qu'un tableau doit être retourné).
Amal Murali
6
Je sais que c'est trop tard, mais pourquoi vous n'utilisez pas le type casting ... (array) $ obj
chhameed
J'ai trouvé json_decode(json_encode($object), True)un tableau différent de celui de la boucle foreach. La boucle foreach renvoie le tableau au format OP demandé.
user3442612
1
@NgSekLong: Pas vraiment, non.
Amal Murali
60

Très simple, transformez d'abord votre objet en objet json, cela retournera une chaîne de votre objet en un représentant JSON.

Prenez ce résultat et décodez avec un paramètre supplémentaire de true, où il se convertira en tableau associatif

$array = json_decode(json_encode($oObject),true);
Rey Ramos
la source
Le problème vient des valeurs qui ne sont pas encodables en json ou non standardisées, c'est-à-dire. Rendez-vous.
Kangur
20

Essaye ça:

$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
la source
1
Fonction parfaite pour changer le stdobject en tableau
Vivek
16

Vous pouvez convertir un objet std en tableau comme ceci:

$objectToArray = (array)$object;
Dinesh Kaswan
la source
1
C'est génial, mais cela ne convertit que le premier niveau. Si vous avez une imbrication, vous devez le faire pour tous les nœuds.
Ivan Carosati
7

Pour les tableaux unidimensionnels:

$array = (array)$class; 

Pour un tableau multidimensionnel:

function stdToArray($obj){
  $reaged = (array)$obj;
  foreach($reaged as $key => &$field){
    if(is_object($field))$field = stdToArray($field);
  }
  return $reaged;
}
Dépassement de pile
la source
5
Bienvenue à SO. Pourriez-vous développer un peu votre réponse pour expliquer comment cela résout le problème?
gung - Réintégrer Monica le
Pour les tableaux à une dimension: $ array = (array) $ class; Pour un tableau multidimensionnel: code d'en haut
Stack Overflow
6
$wpdb->get_results("SELECT ...", ARRAY_A);

ARRAY_A est un argument "output_type". Il peut s'agir de l'une des quatre constantes prédéfinies (par défaut 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.  

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

Vlad
la source
c'est la seule manière suggérée dans le monde WordPress.
Raptor
6

Lors de la conversion d'un objet de classe STD en tableau, convertissez l'objet en tableau en utilisant la fonction de tableau de php.

Essayez avec l'extrait de code suivant.

/*** cast the object ***/    
foreach($stdArray as $key => $value)
{
    $stdArray[$key] = (array) $value;
}   
/*** show the results ***/  
print_r( $stdArray );
NJInamdar
la source
Cela convertira l'objet externe en tableau, mais si l'une des propriétés est également des objets, elle ne sera pas convertie.
Coleman
Selon la question du PO, il a un niveau de structure d'objet. Pour les niveaux suivants, vous devez ajouter une autre boucle foreach.
NJInamdar
3

Vous pouvez essayer ceci:

$aInitialArray = array_map(function($oObject){
    $aConverted = get_object_vars($oObject);
    return $aConverted['post_id'];
}, $aInitialArray);
Sajuna Fernando
la source
1

Utiliser ArrayObject de Std ou créer le vôtre

(nouveau \ ArrayObject ($ existingStdClass))

vous pouvez utiliser la méthode intégrée sur la nouvelle classe:

getArrayCopy ()

ou passez le nouvel objet à

iterator_to_array

Decebal
la source
Si $existingStdClassa une propriété qui en est une autre, stdClasscette propriété reste une stdClass dans le tableau résultant. Si vous avez besoin de quelque chose qui fonctionne récursivement, il semble que vous deviez utiliser les techniques json
Patrick
1

Supposons que $ post_id est un tableau de $ item

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

texte fort

varun sharma
la source
1

si vous avez un tableau et que l'élément du tableau est un élément, stdClassvoici la solution:

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

maintenant le stdClassa été remplacé par un tableau à l'intérieur du tableau en tant que nouvel élément du tableau

softnwords
la source
1

Il existe deux façons simples de convertir un objet stdClass en un tableau

$array = get_object_vars($obj);

et l'autre est

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

ou vous pouvez simplement créer un tableau en utilisant la boucle foreach

$array = array();
foreach($obj as $key){
    $array[] = $key;
}
print_r($array);
Tayyab Hayat
la source
0

J'ai une fonction myOrderId($_GET['ID']);qui renvoie un OBJ multidimensionnel. comme une chaîne .

Aucun des autres 1 doublure ne s'est réveillé pour moi.

Cela a tous deux fonctionné:

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

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
Cyborg
la source