Convierta el objeto stdClass en una matriz en PHP

108

Busco post_id de postmeta como:

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

cuando lo intento, print_r($post_id); tengo una matriz como esta:

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

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

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

)

y no sé cómo atravesarlo, y cómo podría obtener una matriz como esta

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

¿Alguna idea de cómo puedo hacer esto?

Dinesh
fuente
2
Posible duplicado de php stdClass a la matriz
mvladk

Respuestas:

244

La forma más fácil es codificar JSON su objeto y luego decodificarlo de nuevo en una matriz:

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

O si lo prefiere, también puede atravesar el objeto manualmente:

foreach ($object as $value) 
    $array[] = $value->post_id;
Amal Murali
fuente
1
¿Por qué no podemos simplemente hacer $array = json_decode($object,true)?
akshaynagpal
3
@akshaynagpal: daría como resultado un error porque le dará un objeto a una función que espera una cadena JSON como entrada. En la respuesta, estoy convirtiendo el objeto en una cadena JSON y luego lo estoy alimentando como entrada a json_decode () para que devuelva una matriz (el segundo parámetro es True indica que se debe devolver una matriz).
Amal Murali
6
Sé que es demasiado tarde, pero ¿por qué no usas el tipo de conversión ... (matriz) $ obj
chhameed
Encontré json_decode(json_encode($object), True)devuelto una matriz diferente en comparación con el bucle foreach. El bucle foreach devuelve la matriz en el formato solicitado por OP.
user3442612
1
@NgSekLong: Realmente no, no.
Amal Murali
60

Muy simple, primero convierta su objeto en un objeto json, esto devolverá una cadena de su objeto en un representante JSON.

Tome ese resultado y decodifique con un parámetro adicional de verdadero, donde se convertirá en una matriz asociativa

$array = json_decode(json_encode($oObject),true);
Rey Ramos
fuente
El problema es con valores que no son codificables json o no están estandarizados, es decir. fechas.
Kangur
20

Prueba esto:

$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
fuente
1
Función perfecta para cambiar el stdobject a array
Vivek
16

Puede convertir un objeto estándar en una matriz como esta:

$objectToArray = (array)$object;
Dinesh Kaswan
fuente
1
Esto es genial, pero convierte solo el primer nivel. Si tiene anidamiento, debe hacerlo para todos los nodos.
Ivan Carosati
7

Para matrices unidimensionales:

$array = (array)$class; 

Para matriz multidimensional:

function stdToArray($obj){
  $reaged = (array)$obj;
  foreach($reaged as $key => &$field){
    if(is_object($field))$field = stdToArray($field);
  }
  return $reaged;
}
Desbordamiento de pila
fuente
5
Bienvenido a SO. ¿Le importaría ampliar un poco su respuesta para explicar cómo resuelve el problema?
gung - Reincorporación a Monica
Para matrices unidimensionales: $ matriz = (matriz) $ clase; Para una matriz multidimensional: código desde arriba
Stack Overflow
6
$wpdb->get_results("SELECT ...", ARRAY_A);

ARRAY_A es un argumento "tipo_salida". Puede ser una de las cuatro constantes predefinidas (por defecto es 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.  

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

Vlad
fuente
esta es la única forma sugerida en el mundo de WordPress.
Raptor
6

Al convertir un objeto de clase STD en una matriz, pegue el objeto a una matriz utilizando la función de matriz de php.

Pruébelo con el siguiente fragmento de código.

/*** cast the object ***/    
foreach($stdArray as $key => $value)
{
    $stdArray[$key] = (array) $value;
}   
/*** show the results ***/  
print_r( $stdArray );
NJInamdar
fuente
Esto convertirá el objeto externo en una matriz, pero si alguna de las propiedades también son objetos, no se convertirán.
Coleman
Según la pregunta del OP, tiene un nivel de estructura de objeto. Para los siguientes niveles, debe agregar otro bucle foreach.
NJInamdar
3

Puedes probar esto:

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

Usando ArrayObject de Std o construyendo uno propio

(nuevo \ ArrayObject ($ existenteStdClass))

puedes usar el método build in en la nueva clase:

getArrayCopy ()

o pasar el nuevo objeto a

iterator_to_array

Decebal
fuente
Si $existingStdClasstiene una propiedad que es otra stdClass, esa propiedad permanece como stdClass en la matriz resultante. Si necesita algo que funcione de forma recursiva, parece que necesita usar las técnicas json
Patrick
1

Supongamos que $ post_id es una matriz de $ item

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

texto fuerte

varun sharma
fuente
1

si tiene una matriz y el elemento de la matriz es un stdClasselemento, esta es la solución:

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

ahora stdClassha sido reemplazado con una matriz dentro de la matriz como nuevo elemento de matriz

softnwords
fuente
1

Hay dos formas sencillas de convertir un objeto stdClass en una matriz

$array = get_object_vars($obj);

y otro es

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

o simplemente puede crear una matriz usando foreach loop

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

Tengo una función myOrderId($_GET['ID']);que devuelve OBJ multidimensional. como una cadena .

Ninguno de los otros 1 delineador funcionó para mí.

Esto ambos funcionó:

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

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