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?


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;

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);

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;
    }
}

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;

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;
}

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


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 );

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);

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


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


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


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);

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.