PHP'de stdClass nesnesini diziye dönüştür


108

Postmeta'dan post_id'yi şu şekilde getiriyorum:

$post_id = $wpdb->get_results("SELECT post_id FROM $wpdb->postmeta WHERE (meta_key = 'mfn-post-link1' AND meta_value = '". $from ."')");

denediğimde print_r($post_id); şöyle bir diziye sahibim:

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

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

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

)

ve onu nasıl geçeceğimi bilmiyorum ve nasıl böyle bir dizi elde edebilirim

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

Bunu nasıl yapabilirim bir fikriniz var mı?


Yanıtlar:


244

En kolay yol, nesnenizi JSON ile kodlamak ve ardından bir diziye geri döndürmektir:

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

Veya isterseniz nesneyi manuel olarak da gezebilirsiniz:

foreach ($object as $value) 
    $array[] = $value->post_id;

1
Neden yapamıyoruz $array = json_decode($object,true)?
akshaynagpal

3
@akshaynagpal: Girdi olarak bir JSON dizesi bekleyen bir işleve bir nesne vereceğiniz için bir hatayla sonuçlanır. Yanıtta, nesneyi bir JSON dizesine dönüştürüyorum ve ardından bir dizi döndürmesi için json_decode () 'a bir girdi olarak besliyorum (ikinci parametrenin True olması, bir dizinin döndürülmesi gerektiğini belirtir).
Amal Murali

6
bunun çok geç olduğunu biliyorum ama neden tür
çevirmeyi kullanmıyorsunuz

I bulundu json_decode(json_encode($object), True)foreach döngüsü ile karşılaştırıldığında farklı bir dizi geri döndü. Foreach döngüsü, diziyi istenen OP biçiminde döndürür.
user3442612

1
@NgSekLong: Pek değil, hayır.
Amal Murali

60

Çok basit, önce nesnenizi bir json nesnesine dönüştürün, bu nesnenizin bir dizesini JSON temsilcisine döndürür.

Bu sonucu alın ve ek bir true parametresiyle kodunu çözün, burada ilişkilendirilebilir diziye dönüşür

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

Sorun json ile kodlanamayan veya standartlaştırılmayan değerlerle, yani. tarih.
Kangur

20

Bunu dene:

$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
Standart nesneyi diziye dönüştürmek için mükemmel işlev
Vivek

16

Bir std nesnesini şu şekilde diziye dönüştürebilirsiniz:

$objectToArray = (array)$object;

1
Bu harika, ancak yalnızca ilk seviyeyi dönüştürüyor. Yuvalama varsa, bunu tüm düğümler için yapmanız gerekir.
Ivan Carosati

7

Tek boyutlu diziler için:

$array = (array)$class; 

Çok boyutlu dizi için:

function stdToArray($obj){
  $reaged = (array)$obj;
  foreach($reaged as $key => &$field){
    if(is_object($field))$field = stdToArray($field);
  }
  return $reaged;
}

5
SO'ya hoş geldiniz. Sorunu nasıl çözdüğünü açıklamak için cevabınızı biraz genişletebilir misiniz?
gung - Monica'yı eski haline

Tek boyutlu diziler için: $ dizi = (dizi) $ sınıf; Çok boyutlu dizi için: yukarıdan kod
Stack Overflow

6
$wpdb->get_results("SELECT ...", ARRAY_A);

ARRAY_A bir "çıktı_türü" bağımsız değişkendir. Önceden tanımlanmış dört sabitten biri olabilir (varsayılan OBJECT seçeneğidir):

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.  

Bakınız: http://codex.wordpress.org/Class_Reference/wpdb


WordPress dünyasında önerilen tek yol budur.
Raptor

6

STD sınıfı bir nesneyi diziye dönüştürürken. Php'nin dizi işlevini kullanarak nesneyi diziye aktarın .

Aşağıdaki kod parçacığını deneyin.

/*** cast the object ***/    
foreach($stdArray as $key => $value)
{
    $stdArray[$key] = (array) $value;
}   
/*** show the results ***/  
print_r( $stdArray );

Bu, dış nesneyi bir diziye dönüştürür, ancak özelliklerden herhangi biri aynı zamanda nesneyse dönüştürülmez.
Coleman

OP'nin sorusuna göre, bir seviye nesne yapısına sahiptir. Sonraki seviyeler için başka bir foreach döngüsü eklemelisiniz.
NJInamdar

3

Bunu deneyebilirsiniz:

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

1

Std'den ArrayObject'i kullanma veya kendinizinkini oluşturma

(yeni \ ArrayObject ($ mevcutStdClass))

build in yöntemini yeni sınıfta kullanabilirsiniz:

getArrayCopy ()

veya yeni nesneyi

iterator_to_array


Başka $existingStdClassbir özelliğe sahipse , stdClassbu özellik sonuç dizisinde bir stdClass olarak kalır. Yinelemeli çalışan bir şeye ihtiyacınız varsa, o zaman json tekniklerini kullanmanız gerekiyor gibi görünüyor
Patrick

1

$ Post_id'nin $ öğe dizisi olduğunu varsayalım

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

güçlü metin


1

bir diziniz varsa ve dizi stdClassöğeniz öğe ise, çözüm budur:

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

şimdi stdClassyeni dizi öğesi olarak dizinin içindeki bir dizi ile değiştirildi


1

StdClass Nesnesini bir Diziye dönüştürmenin iki basit yolu vardır

$array = get_object_vars($obj);

ve diğeri

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

veya foreach döngüsünü kullanarak basitçe dizi oluşturabilirsiniz

$array = array();
foreach($obj as $key){
    $array[] = $key;
}
print_r($array);

0

Çok myOrderId($_GET['ID']);boyutlu OBJ döndüren bir fonksiyonum var . bir şekilde dize .

Diğer 1 astardan hiçbiri benim için uyanmadı.

Bu ikisi de çalıştı:

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

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.