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?


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;

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);

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

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;

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

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


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 );

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);

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


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


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


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);

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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.