Bir nesneyi bir diziye nasıl dönüştürebilirim?


204
<?php
   print_r($response->response->docs);
?>

Aşağıdakileri çıktılar:

    Array 
(
    [0] => Object 
            (
                [_fields:private] => Array 
                                    (
                                        [id]=>9093 
                                        [name]=>zahir
                                    ) 
            Object 
            ( 
                [_fields:private] => Array 
                                    (
                                        [id]=>9094 
                                        [name]=>hussain
                                    )..
            )
)

Bu nesneyi bir diziye nasıl dönüştürebilirim? Aşağıdakilerin çıktısını almak istiyorum:

Array
(
    [0]=>
    (
        [id]=>9093 
        [name]=>zahir
    ) 
    [1]=>
    (
        [id]=>9094 
        [name]=>hussain
    )...
)

Mümkün mü?

Yanıtlar:


133

Özellikleriniz özel olarak bildirildiği için get_object_vars'a bakmalısınız, bunu sınıf içinde çağırmalı ve sonuçlarını döndürmelisiniz.

Dikkatli olun, dizeler gibi ilkel veri türleri için harika çalışır, ancak iç içe nesnelerle nasıl davrandığını bilmiyorum.

senin durumunda böyle bir şey yapmalısın;

<?php
   print_r(get_object_vars($response->response->docs));
?>

385

Tek boyutlu diziler

Tek boyutlu dizileri dönüştürmek için Benoit'in cevabında bahsettiği (array)ya da orada döküm yapabilirsiniz .get_object_vars

// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);

Birbirlerinden biraz farklı çalışırlar. Örneğin, get_object_varsgeçtiğiniz nesne kapsamında (yani nesnenin bir üye işlevinde) çağrılmadığı sürece, yalnızca genel olarak erişilebilir özelliklere sahip bir dizi döndürür. (array)Öte yandan, şu anda herkese açık olsa da, dizideki tüm herkese açık, gizli ve korunan üyelerin bulunduğu bir diziye yayınlanacak.

Çok boyutlu diziler

Biraz kirli bir yöntem, JSON kodlamak ve daha sonra bir dizinin kodunu çözmek için PHP> = 5.2'nin yerel JSON işlevlerini kullanmaktır. Ancak bu, özel ve korunan üyeleri içermez ve JSON ile kodlanamayan veriler (ikili veriler gibi) içeren nesneler için uygun değildir.

// The second parameter of json_decode forces parsing into an associative array
$array = json_decode(json_encode($object), true);

Alternatif olarak, aşağıdaki işlev bir nesneden özel ve korumalı üyeler içeren bir diziye dönüştürülecek, buradan alınacak ve döküm kullanacak şekilde değiştirilecektir:

function objectToArray ($object) {
    if(!is_object($object) && !is_array($object))
        return $object;

    return array_map('objectToArray', (array) $object);
}

5
İlk çözüm çoklu boyutları ele almadı, ancak ikinci çözüm harika çalıştı.
12:10, sbuck

1
2. çözüm bana unuttum json_decode () için ikinci bir parametre olduğunu hatırlattı .. teşekkürler.
Tyler

1
Bu cevabın neden bu kadar çok oy aldığını merak ediyorum. Her iki çözüm de
get_object_vars'tan

3
@ RJD22: Cevabımı daha 'de facto' bir kaynak haline getirmek için güncelledim, umarım şimdi oylarına layık görüyorsunuz. ;-) Yorumlara atıfta bulunulan "2. çözüm" ün ilk yanıtımda 2. olan JSON çözümü olduğunu herkese not edin.
Andy E

HARİKA! Bir çözüme hayran kaldım ve bunu bulmak için aşağı kaydırdım!
eozzy

44

JSON kodlama / kod çözme işlevlerinin davranışına dayanarak, derinden iç içe geçmiş nesneleri ilişkilendirilebilir dizilere hızlı bir şekilde dönüştürebilirsiniz:

$array = json_decode(json_encode($response->response->docs), true);

2
Bu sorunun en basit cevabı bu. Kullanılan ve harika çalıştı. Teşekkürler
Dustin Fraker

7
Yalnızca bir not - bu, dizinizin UTF8 geçerli verileri içermesi durumunda çalışır. Diziniz başka bir kodlama içeriyorsa, Win1250 diyelim, başarısız olur, çünkü json_encode başarısız olur (php 5.3)
Radek

Bir nesneye nasıl dönüştürülür?
Pmpr

@Trix tekrar json kullanır json_decode (json_encode ($ array), FALSE); Bu da (yinelemeli olarak) tüm alt dizilerinizi nesnelere dönüştürür,
Mufaddal

Keşke bunu bir kereden fazla arttırabilseydim.
JohnFF

34

Dikkatli:

$array = (array) $object;

sığ bir dönüştürme yapar ($ object-> innerObject = new stdClass () bir nesne olarak kalır) ve json kullanarak ileri geri dönüştürme, ancak performansın bir sorun olup olmadığı iyi bir fikir değildir.

Tüm nesnelerin ilişkisel dizilere dönüştürülmesine ihtiyacınız varsa, bunu yapmanın daha iyi bir yoludur (kod yırtıldığı yerden hatırlamıyorum):

function toArray($obj)
{
    if (is_object($obj)) $obj = (array)$obj;
    if (is_array($obj)) {
        $new = array();
        foreach ($obj as $key => $val) {
            $new[$key] = toArray($val);
        }
    } else {
        $new = $obj;
    }

    return $new;
}

Nesne dökümü sonucu oluşan diziyi okuyamıyorum: codepad.viper-7.com/AkX5pq Bunun hakkında bir açıklamanız var mı?
Damien

1
Bu cevabı en çok seviyorum. Andy E'nin özyinelemeli işlevi aslında aynı şeyi yapar, ancak bunu daha kolay anlıyorum.
HartleySan

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

foreachBir nesneyle yapmak için birkaç yol denedim ve bu gerçekten gördüğüm en kolay ve havalı çözüm. Sadece bir satır :)


Yalnızca ortak nesne öznitelikleriyle mükemmel çalışır. Özel olanları dikkate almaz.
Limon

JsonSerialize işlevinin kullanımı hakkında bazı açıklamalar var, ancak bir satır çözümü değil ve ben okudum iyi bir uygulama değil :( stackoverflow.com/questions/7005860/… . Tavsiye için teşekkür ederim.
m3nda

Bir nesneye nasıl dönüştürülür?
Pmpr

18

Basit sürüm:

$arrayObject = new ArrayObject($object);
$array = $arrayObject->getArrayCopy();

Güncelleştirilmiş özyinelemeli sürüm:

class RecursiveArrayObject extends ArrayObject
{
    function getArrayCopy()
    {
        $resultArray = parent::getArrayCopy();
        foreach($resultArray as $key => $val) {
            if (!is_object($val)) {
                continue;
            }
            $o = new RecursiveArrayObject($val);
            $resultArray[$key] = $o->getArrayCopy();
        }
        return $resultArray;
    }
}

$arrayObject = new RecursiveArrayObject($object);
$array = $arrayObject->getArrayCopy();

2

Bunu dene:-

 <?php
  print_r(json_decode(json_encode($response->response->docs),true));
 ?>

2

Aynı sorunu vardı ve yukarıda belirtilen get_object_vars ile çözüldü .

Ayrıca, json_decode ile benim nesne dönüştürmek zorunda kaldı ve oldschool "for" döngü (daha sonra her biri için) ile dizi yinelemek zorunda kaldı.


0

Ayrıca php array_values ​​() yöntemini kullanabilirsiniz


2
Yapamazsın. “Array_values ​​(), parametre 1'in dizi, verilen nesne olmasını bekler”.
manatwork

0

Andy Earnshaw'ın cevabı ile ilgili bir sorunla karşılaştım, çünkü bu işlevi objectToArray () 'e yinelemeli çağrı başarısız olduğu anlamına gelen "HelperFunctions" uygulamam içinde ayrı bir sınıfa dahil etmiştim.

Ben dizi_map çağrısı içinde sınıf adını şöyle belirterek bu üstesinden geldi:

public function objectToArray($object) {
    if (!is_object($object) && !is_array($object))
        return $object;
    return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
}

Bunu yorumlarda yazardım ama henüz yeterince itibarım yok.


-2
//My Function is worked. Hope help full for you :)
      $input = [
            '1' => (object) [1,2,3],
            '2' => (object) [4,5,6,
                (object) [6,7,8,
                [9, 10, 11,
                    (object) [12, 13, 14]]]
            ],
            '3' =>[15, 16, (object)[17, 18]]
        ];

        echo "<pre>";
        var_dump($input);
        var_dump(toAnArray($input));

      public function toAnArray(&$input) {

        if (is_object($input)) {
            $input = get_object_vars($input);
        }
        foreach ($input as &$item) {
            if (is_object($item) || is_array($item)) {
                if (is_object($item)) {
                    $item = get_object_vars($item);
                }
                self::toAnArray($item);
            }
        }
    }

işleviniz hiçbir şey döndürmez. hiçbir şekilde çalışmaz!
Rotimi
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.