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.