Diziye sınıf php


195

Nesne stdClass diziye dönüştürmek için bir sorun var. Bu şekilde denedim:

return (array) $booking;

veya

return (array) json_decode($booking,true);

veya

return (array) json_decode($booking);

Yayınlamadan önceki dizi bir kayıtla dolu, yayınlama denemem boşsa. Satırlarını silmeden nasıl yayınlanır / dönüştürülür?

yayınlamadan önce dizi:

array(1) {   [0]=>   object(stdClass)#23 (36) {     ["id"]=>     string(1) "2"     ["name"]=>     string(0) ""     ["code"]=>     string(5) "56/13"   } } 

Oyuncular boş olduktan sonra var_dump($booking);

Ben de bu işlevi denedim ama her zaman boş:

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 - önce return. Ve json_decodebir dizide koşmak benim için oldukça çaresiz görünüyor, muhtemelen bilgisayarın önünde çok uzun oturuyor ve şimdi mola zamanı?
hakre

Sadece açıklığa kavuşturmak için: var_dump($booking);çıktılar NULL?
hakre

sonra döküm evet, ve ben bu yazdırmak için çalışırsanız: $ booking [0] ['id'] bana var olmayan dönmek
Alessandro Minoccheri

Okumak ilginizi çekebilir: PHP'de yararlı hata mesajları nasıl alınır? - Her neyse, dökümden var_dump() önce soruyordum . Aynı değişken adı btw'yi tekrar kullanmayın. eğer $bookingdökümden önce bir şey olsaydı , yine de dökümden önce bir şey olmalı ve daha sonra farklı bir şey olmamalıdır. Girdi ve işleme değişkenleri arasındaki fark yoksa, orada ne yaptığınızı artık anlamadığınız problemlerle karşılaşırsınız.
hakre

Soruyu kısaltmak (özel işlev kodunu kaldırmak gibi) aşağı kaydırmak zorunda kalmadan kabul edilen yanıtı görmek için yararlı olabilir
cnlevy

Yanıtlar:


433

Yavaş bir liner yöntemi

Küçük bir performans kaybetmek istiyorsanız, JSON yöntemlerini kullanarak bunu tek bir astarda yapabilirsiniz (bazıları, nesneler arasında yinelemeli olarak yinelemekten daha hızlı olduğunu bildirmişlerdir - büyük olasılıkla PHP işlevleri çağırırken yavaştır ). “ Ama ben bunu zaten yaptım ” diyorsunuz. Tam olarak değil - json_decodedizide kullandınız , ancak önce kodlamanız gerekiyor json_encode.

Gereksinimler

json_encodeVe json_decodeyöntemler. Bunlar PHP 5.2.0 ve sonraki sürümlerde otomatik olarak paketlenir. Daha eski bir sürüm kullanıyorsanız, bir PECL kütüphanesi de vardır (bu durumda PHP kurulumunuzu gerçekten güncellemeniz gerekir. 2006 için 5.1 desteği durduruldu.)


Bir array/ stdClass-> dönüştürmestdClass

$stdClass = json_decode(json_encode($booking));

Bir array/ stdClass-> dönüştürmearray

Kılavuz ikinci argümanı şu şekilde belirtir json_decode:

assoc
Ne zaman TRUE, döndürülen nesneler ilişkilendirilebilir dizilere dönüştürülecektir.

Bu nedenle, aşağıdaki satır tüm nesnenizi bir diziye dönüştürür:

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

1
Eğer (array) $booking;bir de var_dumpolduğu NULL(OP tarafından yazılmış gibi), bu kod dönecek tahmin edin?
hakre

@hakre NULLBir dizi olarak yayınladıktan sonra görünmüyor . Bence OP kullanımdan NULLsonra json_decode($array)bu kılavuz başına mantıklı anlamına gelir . Json kodu çözülemezse NULL döndürülür
h2ooooooo

4
@AlessandroMinoccheri Daha önce çalışmamasının nedeni json_decode()bir dizide kullanmadan önceydi . json_decodeJSON dizesinde kullanılmalıdır. Bu nedenle, önce bir JSON dizesi olarak kodlarsak ( json_encode) sonra da kodunu çözersek (JSON dizemizi kullanarak), o zaman iyi çalışır.
h2ooooooo

3
Herkes JSON spesifikasyonunda tanımlanmayan türlerinizi (örneğin tarihler) kaybedeceğinizi unuttu mu? Bu yaklaşımı kullanırsanız bir reviver'a ihtiyacınız olacaktır. Bu, yalnızca sayılar, dizeler ve booleanlar gibi temel türleriniz varsa iyidir.
Denis Pshenov

1
Harika cevap, sadece json_decode ($ stdClass, true);) kullanıyorum
didando8a

68

peşinde olduğunuz türden standart bir dizi geri almak için bu işlevi kullanın ...

return get_object_vars($booking);

19
Bu özyinelemeli değil
gawpertron

17

Yayınlamadan önce bir dizi olduğundan, yayınlamak mantıklı değil.

Böyle bir şeye benzeyen özyinelemeli bir döküm isteyebilirsiniz:

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

Kullanımı:

$obj = new stdClass;
$obj->aaa = 'asdf';
$obj->bbb = 'adsf43';
$arr = array('asdf', array($obj, 3));

var_dump($arr);
$arr = arrayCastRecursive($arr);
var_dump($arr);

Önce sonuç:

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

Sonuç:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        array
          'aaa' => string 'asdf' (length = 4)
          'bbb' => string 'adsf43' (length = 6)
      1 => int 3

Not:

Bir stdClass nesnesinin diğer stdClass nesnelerini içerebileceği karmaşık dizilerle test edilmiş ve bu dizilerle çalışılmıştır.


Harika. Şimdi stdClass nesneleri içeren stdClass nesneleri için çalışıyor :)
Vlad Preda

14

Php stdClass'ı diziye dönüştürmek için lütfen aşağıdaki php işlevini kullanın

get_object_vars($data)

2
Bu işlevin özyinelemediğini unutmayın. Özyinelemeli bir çözüm için Carlo Fontanos'un cevabına bakınız .
Courtney Miles


12

Yerleşik tür döküm işlevini kullanın, basitçe yazın

$realArray = (array)$stdClass;

1
Bunu json_decode / encode, çok daha temiz +1 tercih ediyorum
Logan

2
Bu yöntem daha temizdir, ancak yinelemeli değildir ve get_object_vars () ile aynı şekilde çalışır. Json_decode / encode yöntemi bir saldırı hissine sahip olsa da, özyinelemeli olarak çalışır.
Debbie V

3

Sadece googled ve burada stdClass nesnesini tekrar tekrar diziye dönüştürmek için yararlı olan kullanışlı bir işlev buldu .

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

DÜZENLEME : Bu yanıtı bana önerdiği için mason81 sayesinde, bağlantılı kaynaktan gelen içerikle (şimdi de değiştirildi) güncelledim.


1
Bir dahaki sefere lütfen bağlantılı kaynaktan ilgili içeriği ekleyin. Sağladığınız bağlantı değişti ve artık alakasız ve işe yaramaz.
mason81

Aradığım şey bu, çok teşekkür ederim.

0

Carlo'nun cevabının bir sınıfta kullanılabilecek bir versiyonu:

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

Aşağıdaki kod tüm e-postaları okuyacak ve Konu, Gövde ve Tarih yazacaktır.

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

Bu, aşağıdakileri çıkarır:

$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 

Çeşitli önerileri ile mücadele ettikten sonra bu çözümü bulmak için deneme yanılma kullandım. Umarım yardımcı olur.


0

İşte en iyi Nesne Dizisi işlevi - özyinelemeli çalışır:

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

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.