Converta o objeto stdClass em array em PHP

108

Eu 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 ."')");

quando tento print_r($post_id); , tenho uma matriz assim:

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

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

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

)

e eu não sei como atravessá-lo, e como eu poderia obter um array como este

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

Alguma ideia de como posso fazer isso?

Dinesh
fonte
2
Possível duplicata de php stdClass para array
mvladk de

Respostas:

244

A maneira mais fácil é codificar seu objeto em JSON e depois decodificá-lo de volta para uma matriz:

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

Ou, se preferir, também pode percorrer o objeto manualmente:

foreach ($object as $value) 
    $array[] = $value->post_id;
Amal Murali
fonte
1
Por que não podemos simplesmente fazer $array = json_decode($object,true)?
akshaynagpal
3
@akshaynagpal: Isso resultaria em um erro porque você fornecerá um objeto a uma função que espera uma string JSON como sua entrada. Na resposta, estou convertendo o objeto em uma string JSON e, em seguida, alimentando-o como uma entrada para json_decode () para que ele retorne um array (o segundo parâmetro sendo True indica que um array deve ser retornado).
Amal Murali
6
Eu sei que é tarde demais, mas por que você não usa conversão de tipo ... (array) $ obj
chhameed
Descobri que json_decode(json_encode($object), True)retornou um array diferente em comparação com o loop foreach. O loop foreach retorna a matriz no formato que OP pediu.
user3442612
1
@NgSekLong: Na verdade não.
Amal Murali
60

Muito simples, primeiro transforme seu objeto em um objeto json, isso retornará uma string de seu objeto em um representante JSON.

Pegue esse resultado e decodifique com um parâmetro extra de true, onde será convertido em array associativo

$array = json_decode(json_encode($oObject),true);
Rey Ramos
fonte
O problema é com valores que não são codificados por json ou não padronizados, ou seja, datas.
Kangur de
20

Experimente isto:

$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;
    }
}
Alessandro Minoccheri
fonte
1
Função perfeita para mudar o stdobject para array
Vivek
16

Você pode converter um objeto std em array como este:

$objectToArray = (array)$object;
Dinesh Kaswan
fonte
1
Isso é ótimo, mas converte apenas o primeiro nível. Se você tiver aninhamento, terá que fazer isso para todos os nós.
Ivan Carosati
7

Para matrizes unidimensionais:

$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;
}
Stack Overflow
fonte
5
Bem-vindo ao SO. Você se importaria de expandir um pouco sua resposta para explicar como isso resolve o problema?
gung - Reintegrar Monica
Para arrays unidimensionais: $ array = (array) $ class; Para matriz multidimensional: código acima
Stack Overflow
6
$wpdb->get_results("SELECT ...", ARRAY_A);

ARRAY_A é um argumento "output_type". Pode ser uma das quatro constantes predefinidas (o padrão é 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.  

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

Vlad
fonte
esta é a única forma sugerida no mundo WordPress.
Raptor
6

Ao converter um objeto de classe STD em array.Cast o objeto em array usando a função array do php.

Experimente com o seguinte trecho de código.

/*** cast the object ***/    
foreach($stdArray as $key => $value)
{
    $stdArray[$key] = (array) $value;
}   
/*** show the results ***/  
print_r( $stdArray );
NJInamdar
fonte
Isso converterá o objeto externo em uma matriz, mas se alguma das propriedades também for objeto, ela não será convertida.
Coleman de
De acordo com a pergunta do OP, ele tem um nível de estrutura de objeto. Para os próximos níveis, você deve adicionar outro loop foreach.
NJInamdar
3

Você pode tentar isto:

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

Usando o ArrayObject do Std ou construindo o seu próprio

(novo \ ArrayObject ($ existingStdClass))

você pode usar o método integrado na nova classe:

getArrayCopy ()

ou passe o novo objeto para

iterator_to_array

Decebal
fonte
Se $existingStdClasstiver uma propriedade que seja outra stdClass, essa propriedade permanecerá como stdClass na matriz resultante. Se você precisa de algo que funcione recursivamente, então parece que você precisa usar as técnicas json
Patrick
1

Vamos assumir que $ post_id é um array de $ item

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

texto forte

Varun Sharma
fonte
1

se você tiver uma matriz e o elemento da matriz for stdClassitem, esta é a solução:

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

agora o stdClassfoi substituído por um array dentro do array como um novo elemento do array

softnwords
fonte
1

Existem duas maneiras simples de converter o objeto stdClass em um Array

$array = get_object_vars($obj);

e outro é

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

ou você pode simplesmente criar uma matriz usando o loop foreach

$array = array();
foreach($obj as $key){
    $array[] = $key;
}
print_r($array);
Tayyab Hayat
fonte
0

Eu tenho uma função myOrderId($_GET['ID']);que retorna OBJ multidimensional. como uma string .

Nenhum dos outros 1 forro funcionou para mim.

Ambos funcionaram:

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

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