Jak przekonwertować obiekt na tablicę?

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

Wytwarza następujące:

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

Jak przekonwertować ten obiekt na tablicę? Chciałbym wyprowadzić następujące:

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

czy to możliwe?

zahir hussain
źródło

Odpowiedzi:

133

Powinieneś spojrzeć na get_object_vars , ponieważ twoje właściwości są uznane za prywatne, powinieneś wywołać to w klasie i zwrócić jej wyniki.

Bądź ostrożny, w przypadku prymitywnych typów danych, takich jak łańcuchy, będzie on działał świetnie, ale nie wiem, jak zachowuje się z zagnieżdżonymi obiektami.

w twoim przypadku musisz zrobić coś takiego;

<?php
   print_r(get_object_vars($response->response->docs));
?>
Benoit
źródło
385

Tablice jednowymiarowe

Aby przekonwertować tablice jednowymiarowe, możesz rzucić za pomocą (array)lub tam get_object_vars, o czym Benoit wspomniał w swojej odpowiedzi .

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

Działają nieco inaczej od siebie. Na przykład get_object_varszwróci tablicę z tylko publicznie dostępnymi właściwościami, chyba że zostanie wywołana z zakresu przekazywanego obiektu (tj. W funkcji składowej obiektu). (array), z drugiej strony, rzuci na tablicę z wszystkimi członkami publicznymi, prywatnymi i chronionymi nietkniętymi na tablicy, choć oczywiście wszyscy są teraz publiczni.

Tablice wielowymiarowe

Nieco brudną metodą jest użycie natywnych funkcji JSON PHP> = 5.2 do kodowania do JSON, a następnie dekodowania z powrotem do tablicy. Nie obejmie to jednak członków prywatnych i chronionych i nie jest odpowiednie dla obiektów zawierających dane, których nie można zakodować w JSON (takich jak dane binarne).

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

Alternatywnie, następująca funkcja skonwertuje z obiektu na tablicę zawierającą prywatne i chronione elementy, pobrane stąd i zmodyfikowane w celu użycia rzutowania:

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

    return array_map('objectToArray', (array) $object);
}
Andy E.
źródło
5
Pierwsze rozwiązanie nie obsługiwało mutlidimension, ale drugie rozwiązanie działało świetnie.
sbuck
1
Drugie rozwiązanie przypomniało mi, że istnieje drugi parametr json_decode (), o którym zapomniałem .. dzięki.
Tyler,
1
Zastanawiam się, dlaczego ta odpowiedź zdobywa tak wiele głosów. Oba rozwiązania są mniej jasne i ładne niż get_object_vars
RJD22
3
@ RJD22: Zaktualizowałem moją odpowiedź, aby uczynić ją bardziej „de facto” zasobem, mam nadzieję, że uważasz ją teraz za wartą podniesienia głosów. ;-) Zauważ wszystkim, że „drugie rozwiązanie”, do którego odnoszą się komentarze, to rozwiązanie JSON, które było drugim w mojej pierwszej odpowiedzi.
Andy E
NIESAMOWITE! Zaskoczyło mnie to rozwiązanie i przewinąłem w dół, aby je znaleźć!
eozzy
44

Możesz szybko przekonwertować głęboko zagnieżdżone obiekty na tablice asocjacyjne, polegając na działaniu funkcji kodowania / dekodowania JSON:

$array = json_decode(json_encode($response->response->docs), true);
Mufaddal
źródło
2
To najprostsza odpowiedź na ten problem. Użyłem go i zadziałało niesamowicie. Dzięki
Dustin Fraker
7
Tylko uwaga - zadziała, jeśli tablica zawiera prawidłowe dane UTF8. Jeśli tablica zawiera inne kodowanie, powiedzmy Win1250, to się nie powiedzie, bo json_encode zawiedzie (php 5.3)
Radek
Jak przekonwertować go z powrotem na obiekt?
Pmpr
@Trix ponownie używa json_dekod json_kod (json_encode ($ array), FALSE); To także (rekurencyjnie) konwertuje wszystkie twoje tablice podrzędne na obiekty,
Mufaddal
Chciałbym móc to poprawić więcej niż raz.
JohnFF
34

Ostrożny:

$array = (array) $object;

robi płytką konwersję ($ object-> innerObject = new stdClass () pozostaje obiektem) i konwersję tam iz powrotem za pomocą json działa, ale nie jest dobrym pomysłem, jeśli wydajność jest problemem.

Jeśli potrzebujesz przekonwertować wszystkie obiekty na tablice asocjacyjne, oto lepszy sposób na zrobienie tego (kod zgrany z nie pamiętam gdzie):

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;
}
Sergio
źródło
Nie mogę odczytać tablicy wynikającej z rzutowania obiektu: codepad.viper-7.com/AkX5pq Czy masz jakieś wyjaśnienia na ten temat?
Damien
1
Najbardziej podoba mi się ta odpowiedź. Funkcja rekurencyjna Andy E. zasadniczo robi to samo, ale uważam, że jest to łatwiejsze do zrozumienia.
HartleySan,
20
$array = json_decode(json_encode($object), true);

Wypróbowałem kilka sposobów zrobienia foreachz obiektem i TO jest naprawdę najłatwiejsze i najfajniejsze obejście, jakie widziałem. Tylko jedna linia :)

m3nda
źródło
Działa idealnie tylko z atrybutami obiektów publicznych. Nie uwzględnia prywatnych.
Limon
Oto kilka wyjaśnień na temat korzystania z funkcji JsonSerialize, ale nie jest to rozwiązanie jednoliniowe, o którym czytałem, nie jest dobrą praktyką :( stackoverflow.com/questions/7005860
....
Jak przekonwertować go z powrotem na obiekt?
Pmpr
18

Prosta wersja:

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

Zaktualizowana wersja rekurencyjna:

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();
Styks
źródło
2

Spróbuj tego:-

 <?php
  print_r(json_decode(json_encode($response->response->docs),true));
 ?>
kunal
źródło
2

Miałem ten sam problem i rozwiązałem go za pomocą wyżej wymienionych get_object_vars .

Ponadto musiałem przekonwertować mój obiekt za pomocą json_decode i musiałem iterować tablicę za pomocą starej pętli „for” (zamiast for-each).

Lucas Bacciotti
źródło
0

Możesz także użyć metody php typu array_values ​​()

Rikin Adhyapak
źródło
2
Nie możesz „Array_values ​​() oczekuje, że parametr 1 będzie tablicą, obiekt dany”.
manatwork
0

Wystąpił problem z odpowiedzią Andy'ego Earnshawa, ponieważ rozdzieliłem tę funkcję na osobną klasę w mojej aplikacji „HelperFunctions”, co oznaczało, że nie powiodło się rekurencyjne wywołanie obiektu objectToArray ().

Rozwiązałem ten problem, podając nazwę klasy w wywołaniu array_map w następujący sposób:

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

Napisałbym to w komentarzach, ale nie mam jeszcze wystarczającej reputacji.

leon.clements
źródło
-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);
            }
        }
    }
nguyentrung206
źródło
twoja funkcja nic nie zwraca. nie ma mowy, żeby to działało!
Rotimi,