php stdClass a array


195

Ho un problema a convertire un oggetto stdClass in array. Ho provato in questo modo:

return (array) $booking;

o

return (array) json_decode($booking,true);

o

return (array) json_decode($booking);

L'array prima del cast è pieno con un record, dopo che il mio tentativo di lanciarlo è vuoto. Come lanciarlo / convertirlo senza eliminare le sue righe?

matrice prima del cast:

array(1) {   [0]=>   object(stdClass)#23 (36) {     ["id"]=>     string(1) "2"     ["name"]=>     string(0) ""     ["code"]=>     string(5) "56/13"   } } 

dopo il cast è vuoto NULL se provo a creare un var_dump($booking);

Ho anche provato questa funzione ma sempre vuota:

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

php.net/var_dump ... php.net/var_export - prima return. E correre json_decodesu un array mi sembra piuttosto disperato, probabilmente seduto troppo a lungo davanti al computer ed è ora di fare una pausa?
Hacre,

Giusto per chiarire: var_dump($booking);output NULL?
Hacre,

dopo il cast sì, e se provo a stampare questo: $ booking [0] ['id'] restituiscimi che non esiste
Alessandro Minoccheri

Potresti essere interessato a leggere: Come ottenere utili messaggi di errore in PHP? - Comunque, lo stavo chiedendo var_dump() prima del casting. Non riutilizzare lo stesso nome di variabile btw. se $bookingfosse qualcosa prima del casting, dovrebbe essere comunque quel qualcosa prima del casting e non qualcosa di diverso in seguito. Differisci tra le variabili di input e di elaborazione, altrimenti incappi in problemi che non capisci più cosa fai lì.
Hacre,

Accorciare la domanda (come rimuovere il codice della funzione personalizzata) potrebbe essere utile per vedere la risposta accettata senza dover scorrere verso il basso
cnlevy,

Risposte:


432

Il metodo pigro a una fodera

Puoi farlo in una sola riga usando i metodi JSON se sei disposto a perdere un po 'di prestazioni (anche se alcuni hanno riferito che è più veloce dell'iterazione ricorsiva degli oggetti, molto probabilmente perché PHP è lento nel chiamare le funzioni ). " Ma l'ho già fatto " dici. Non esattamente: hai usato json_decodel'array, ma devi json_encodeprima codificarlo .

Requisiti

I metodi json_encodee json_decode. Questi sono automaticamente raggruppati in PHP 5.2.0 e versioni successive. Se usi una versione precedente c'è anche una libreria PECL (detto questo, in quel caso dovresti davvero aggiornare la tua installazione di PHP. Il supporto per 5.1 è stato interrotto nel 2006.)


Conversione di un array/ stdClass->stdClass

$stdClass = json_decode(json_encode($booking));

Conversione di un array/ stdClass->array

Il manuale specifica il secondo argomento di json_decodecome:

assoc
Quando TRUE, gli oggetti restituiti verranno convertiti in array associativi.

Quindi la seguente riga convertirà l'intero oggetto in un array:

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

1
Se (array) $booking;in a var_dumpè NULL(come scritto da OP), indovina cosa restituirà questo codice?
Hacre,

@hakre Non sembra che sia NULLdopo averlo lanciato come un array. Penso che OP significhi che è NULLdopo l'uso json_decode($array)che ha senso per il manuale . Viene restituito NULL se il json non può essere decodificato
h2ooooooo,

4
@AlessandroMinoccheri Il motivo per cui non ha funzionato prima era prima di utilizzarlo json_decode()su un array. json_decodedovrebbe essere usato su una stringa JSON. Pertanto, se prima lo codifichiamo come stringa JSON ( json_encode) e quindi la decodifichiamo (usando la nostra stringa JSON), allora funziona perfettamente.
h2ooooooo,

3
Tutti hanno dimenticato che perderai i tuoi tipi che non sono definiti nelle specifiche JSON (date ad esempio)? Avrai bisogno di un reviver se usi questo approccio. Questo è utile solo se hai tipi di base come numeri, stringhe e valori booleani.
Denis Pshenov,

1
Ottima risposta, sto solo usando json_decode ($ stdClass, true);)
didando8a

68

usa questa funzione per recuperare un array standard del tipo che stai cercando ...

return get_object_vars($booking);

19
Questo non è ricorsivo
gawpertron,

17

Dal momento che è un array prima di lanciarlo, il casting non ha senso.

Potresti voler un cast ricorsivo, che assomiglierebbe a questo:

function arrayCastRecursive($array)
{
    if (is_array($array)) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $array[$key] = arrayCastRecursive($value);
            }
            if ($value instanceof stdClass) {
                $array[$key] = arrayCastRecursive((array)$value);
            }
        }
    }
    if ($array instanceof stdClass) {
        return arrayCastRecursive((array)$array);
    }
    return $array;
}

Uso:

$obj = new stdClass;
$obj->aaa = 'asdf';
$obj->bbb = 'adsf43';
$arr = array('asdf', array($obj, 3));

var_dump($arr);
$arr = arrayCastRecursive($arr);
var_dump($arr);

Risultato prima:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        object(stdClass)[1]
          public 'aaa' => string 'asdf' (length = 4)
          public 'bbb' => string 'adsf43' (length = 6)
      1 => int 3

Risultato dopo:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        array
          'aaa' => string 'asdf' (length = 4)
          'bbb' => string 'adsf43' (length = 6)
      1 => int 3

Nota:

Testato e funzionante con matrici complesse in cui un oggetto stdClass può contenere altri oggetti stdClass.


Grande. Ora funziona con oggetti stdClass che contengono oggetti stdClass :)
Vlad Preda,

14

Utilizzare la seguente funzione php per convertire php stdClass in array

get_object_vars($data)

2
Si noti che questa funzione non è ricorsiva. Fare riferimento alla risposta di Carlo Fontanos per una soluzione ricorsiva.
Courtney Miles,


12

Utilizza la funzionalità di cast di tipo integrata, digita semplicemente

$realArray = (array)$stdClass;

1
Preferisco questo rispetto a json_decode / encode, molto più pulito +1
Logan

2
Questo metodo è più pulito, tuttavia, non è anche ricorsivo e funziona allo stesso modo di get_object_vars (). Mentre il metodo json_decode / encode ha la sensazione di un hack, funziona in modo ricorsivo.
Debbie V,

3

Lo ho appena cercato su Google e ho trovato qui una comoda funzione utile per convertire ricorsivamente gli oggetti stdClass in array.

<?php
function object_to_array($object) {
 if (is_object($object)) {
  return array_map(__FUNCTION__, get_object_vars($object));
 } else if (is_array($object)) {
  return array_map(__FUNCTION__, $object);
 } else {
  return $object;
 }
}
?>

EDIT : ho aggiornato questa risposta con contenuti da fonti collegate (che ora è anche cambiato), grazie a mason81 per avermi suggerito.


1
La prossima volta includi il contenuto pertinente dalla fonte collegata. Il link che hai fornito è cambiato ed è ora irrilevante e inutile.
mason81,

Questo è quello che stavo cercando, grazie mille.

0

Ecco una versione della risposta di Carlo che può essere utilizzata in una classe:

class Formatter
{
    public function objectToArray($data)
    {
        if (is_object($data)) {
            $data = get_object_vars($data);
        }

        if (is_array($data)) {
            return array_map(array($this, 'objectToArray'), $data);
        }

        return $data;
    }
}

0

Il codice seguente legge tutte le e-mail e stampa Oggetto, Corpo e data.

<?php
  $imap=imap_open("Mailbox","Email Address","Password");
  if($imap){$fixMessages=1+imap_num_msg($imap);  //Check no.of.msgs
/*
By adding 1 to "imap_num_msg($imap)" & starting at $count=1
   the "Start" & "End" non-messages are ignored
*/
    for ($count=1; $count<$fixMessages; $count++){
      $objectOverview=imap_fetch_overview($imap,$count,0);
print '<br>$objectOverview: '; print_r($objectOverview);
print '<br>objectSubject ='.($objectOverview[0]->subject));
print '<br>objectDate ='.($objectOverview[0]->date);
      $bodyMessage=imap_fetchbody($imap,$count,1);
print '<br>bodyMessage ='.$bodyMessage.'<br><br>';
    }  //for ($count=1; $count<$fixMessages; $count++)
  }  //if($imap)
  imap_close($imap);
?>

Ciò genera quanto segue:

$objectOverview: Array ( [0] => stdClass Object ( [subject] => Hello
[from] => Email Address [to] => Email Address [date] => Sun, 16 Jul 2017 20:23:18 +0100
[message_id] =>  [size] => 741 [uid] => 2 [msgno] => 2 [recent] => 0 [flagged] => 0 
[answered] => 0 [deleted] => 0 [seen] => 1 [draft] => 0 [udate] => 1500232998 ) )
objectSubject =Hello
objectDate =Sun, 16 Jul 2017 20:23:18 +0100
bodyMessage =Test 

Dopo aver lottato con vari suggerimenti, ho usato tentativi ed errori per trovare questa soluzione. Spero che sia d'aiuto.


0

Ecco la migliore funzione Object to Array che ho - funziona in modo ricorsivo:

function object_to_array($obj, &$arr){

    if(!is_object($obj) && !is_array($obj)){
        $arr = $obj;
        return $arr;
    }

    foreach ($obj as $key => $value)
    {
        if (!empty($value))
        {
            $arr[$key] = array();
            object_to_array_v2($value, $arr[$key]);
        }
        else
        {
            $arr[$key] = $value;
        }
    }
    return $arr;
}

$ clean_array = object_to_array ($ object_data_here);

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.