Converte l'oggetto stdClass in array in PHP


108

Recupero post_id da postmeta come:

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

quando provo print_r($post_id); ho un array come questo:

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

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

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

)

e non so come attraversarlo, e come potrei ottenere un array come questo

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

Qualche idea su come posso farlo?


2
Possibile duplicato di php stdClass su array
mvladk

Risposte:


244

Il modo più semplice è codificare in JSON il tuo oggetto e poi decodificarlo in un array:

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

Oppure, se preferisci, puoi anche attraversare l'oggetto manualmente:

foreach ($object as $value) 
    $array[] = $value->post_id;

1
Perché non possiamo semplicemente farlo $array = json_decode($object,true)?
akshaynagpal

3
@akshaynagpal: risulterebbe in un errore perché fornirai un oggetto a una funzione che si aspetta una stringa JSON come input. Nella risposta, sto convertendo l'oggetto in una stringa JSON, quindi lo sto fornendo come input a json_decode () in modo che restituisca un array (il secondo parametro come True indica che un array dovrebbe essere restituito).
Amal Murali

6
So che è troppo tardi, ma perché non usi il casting del tipo ... (array) $ obj
chhameed

Ho trovato json_decode(json_encode($object), True)restituito un array diverso rispetto al ciclo foreach. Il ciclo foreach restituisce l'array nel formato richiesto dall'OP.
user3442612

1
@ NgSekLong: Non proprio, no.
Amal Murali

60

Molto semplice, prima trasforma il tuo oggetto in un oggetto json, questo restituirà una stringa del tuo oggetto in un rappresentante JSON.

Prendi quel risultato e decodifica con un parametro extra di true, dove verrà convertito in array associativo

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

Il problema è con i valori che non sono codificabili in json o non standardizzati, ad es. date.
Kangur

20

Prova questo:

$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
Funzione perfetta per cambiare lo stdobject in array
Vivek

16

Puoi convertire un oggetto std in un array in questo modo:

$objectToArray = (array)$object;

1
È fantastico, ma converte solo il primo livello. Se hai l'annidamento devi farlo per tutti i nodi.
Ivan Carosati

7

Per array unidimensionali:

$array = (array)$class; 

Per array multidimensionale:

function stdToArray($obj){
  $reaged = (array)$obj;
  foreach($reaged as $key => &$field){
    if(is_object($field))$field = stdToArray($field);
  }
  return $reaged;
}

5
Benvenuto in SO. Ti dispiacerebbe espandere un po 'la tua risposta per spiegare come risolve il problema?
gung - Ripristina Monica il

Per array unidimensionali: $ array = (array) $ class; Per array multidimensionali: codice dall'alto
Stack Overflow

6
$wpdb->get_results("SELECT ...", ARRAY_A);

ARRAY_A è un argomento "output_type". Può essere una delle quattro costanti predefinite (il valore predefinito è 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.  

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


questo è l'unico modo suggerito nel mondo WordPress.
Raptor

6

Durante la conversione di un oggetto di classe STD in array, invia l'oggetto in array utilizzando la funzione array di php.

Prova con il seguente frammento di codice.

/*** cast the object ***/    
foreach($stdArray as $key => $value)
{
    $stdArray[$key] = (array) $value;
}   
/*** show the results ***/  
print_r( $stdArray );

Questo convertirà l'oggetto esterno in un array, ma se anche una delle proprietà è un oggetto non verrà convertito.
Coleman

Secondo la domanda dell'OP ha un livello di struttura degli oggetti. Per i livelli successivi devi aggiungere un altro ciclo foreach.
NJ Inamdar

3

Puoi provare questo:

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

1

Utilizzando ArrayObject da Std o costruendone uno personalizzato

(nuovo \ ArrayObject ($ existingStdClass))

puoi usare il metodo build in sulla nuova classe:

getArrayCopy ()

o passa il nuovo oggetto a

iterator_to_array


Se $existingStdClassha una proprietà che è un'altra, stdClassquella proprietà rimane una stdClass nell'array risultante. Se hai bisogno di qualcosa che funzioni in modo ricorsivo, sembra che tu debba usare le tecniche json
Patrick

1

Supponiamo che $ post_id sia un array di $ item

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

testo forte


1

se hai un array e l'elemento array è stdClassitem, questa è la soluzione:

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

ora stdClassè stato sostituito con un array all'interno dell'array come nuovo elemento dell'array


1

Esistono due semplici modi per convertire l'oggetto stdClass in un array

$array = get_object_vars($obj);

e altro è

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

oppure puoi semplicemente creare un array usando il ciclo foreach

$array = array();
foreach($obj as $key){
    $array[] = $key;
}
print_r($array);

0

Ho una funzione myOrderId($_GET['ID']);che restituisce OBJ multidimensionale. come una stringa .

Nessuno degli altri 1 nave ha funzionato per me.

Entrambi hanno funzionato:

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

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.