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.