Jak przekonwertować taką tablicę na obiekt?
[128] => Array
(
[status] => Figure A.
Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
)
[129] => Array
(
[status] => The other day at work, I had some spare time
)
$a = (object)['hello' => 'world'];
Odpowiedzi:
W najprostszym przypadku prawdopodobnie wystarczy „rzutować” tablicę jako obiekt:
Inną opcją byłoby utworzenie instancji klasy standardowej jako zmiennej i przejście przez tablicę podczas ponownego przypisywania wartości:
Jak zauważył Edson Medina , naprawdę czystym rozwiązaniem jest użycie wbudowanych
json_
funkcji:To również (rekurencyjnie) konwertuje wszystkie podrzędne tablice na obiekty, których możesz chcieć lub nie. Niestety ma 2-3-krotny wzrost wydajności w stosunku do pętli.
Ostrzeżenie! (dzięki Ultra za komentarz):
źródło
x
w tablicy zawiera odniesienie do innej tablicy. Następnie$object->x
po wykonaniu jednej linijki będzie duplikatem$array['x']
, a nie odniesieniem do oryginalnej tablicy. W niektórych aplikacjach może to być nieszkodliwe, ale w przypadku dużych tablic marnuje pamięć i może popsuć wykonanie, jeśli odwołanie zostanie użyte później.możesz po prostu użyć rzutowania typu, aby przekonwertować tablicę na obiekt.
źródło
Byłoby to łatwe
Ale nie tego chcesz. Jeśli chcesz przedmiotów, chcesz coś osiągnąć, ale tego brakuje w tym pytaniu. Używanie obiektów tylko z tego powodu nie ma sensu.
źródło
Szybki hack:
Nie ładna, ale działa.
źródło
$this
w komentarzach, które następują jako akcesor, to mocno sugeruje, że pragniestdClass
wystąpienia jako wyniku, a nie klasa zdefiniowana przez użytkownika, taka jak twoja odpowiedź. Zgadzam się z elegancją tego rozwiązania, ale niestety jest to dość powszechnie stosowany wzór, aby rozwiązać ten problem z zagnieżdżonymi tablicami, w których rzutowanie na obiekt nie działa. Możliwe jest również, że OP używa interfejsu wymagającego i obiektu jako danych wejściowych, a nie tablicy.Oto trzy sposoby:
Fałszywy prawdziwy obiekt:
Konwertuj tablicę na obiekt, rzutując ją na obiekt:
Ręcznie przekonwertuj tablicę na obiekt:
źródło
Jest to prosty sposób: stworzy również obiekt dla tablic rekurencyjnych:
źródło
false
dojson_decode()
zwróci tablicę asocjacyjną.true
dojson_decode
zwróci tablicę asocjacyjną,false
jest ustawieniem domyślnym i zwróciStdClass
instancję.W zależności od tego, gdzie jest to potrzebne i jak uzyskać dostęp do obiektu, istnieją różne sposoby, aby to zrobić.
Na przykład: po prostu wybierz go
Jednak najbardziej kompatybilna jest metoda narzędziowa (jeszcze nie będąca częścią PHP), która implementuje standardowe rzutowanie PHP w oparciu o ciąg znaków określający typ (lub ignorując to, usuwając odwołanie z wartości):
Przykład użycia w twoim przypadku ( prezentacja online ):
źródło
Ten działał dla mnie
stosowanie :
zwroty :
jak zwykle możesz zapętlić go w następujący sposób:
źródło
$obj = (object) $array;
nie działa dla tablic wielowymiarowych.O ile mi wiadomo, nie ma wbudowanej metody, aby to zrobić, ale jest to tak proste, jak prosta pętla:
Możesz to wyjaśnić, jeśli potrzebujesz go do rekurencyjnej budowy obiektu.
źródło
Możesz użyć funkcji (obiekt), aby przekonwertować tablicę na obiekt.
Wynikiem będzie obiekt zawierający tablice:
źródło
W rzeczywistości, jeśli chcesz używać tego z tablicami wielowymiarowymi, powinieneś użyć pewnej rekurencji.
źródło
Zdecydowanie wybrałbym taką czystą drogę:
jeśli prześlesz:
dostaniesz to:
Przekonałem się, że bardziej logiczne jest porównanie powyższych odpowiedzi z Obiektów do celów, do których zostały stworzone (zamknięte małe słodkie obiekty).
Również za pomocą get_object_vars upewnij się, że w manipulowanym obiekcie nie są tworzone żadne dodatkowe atrybuty (nie chcesz, aby samochód miał nazwisko, ani osoba zachowująca się na 4 kołach).
źródło
Możesz także użyć ArrayObject, na przykład:
źródło
Ten, którego używam (jest członkiem klasy):
źródło
Technika mało skomplikowana, ale łatwa do rozszerzenia:
Załóżmy, że masz tablicę
Załóżmy, że masz klasę Person, która może mieć więcej lub mniej atrybutów z tej tablicy. na przykład
Jeśli nadal chcesz zmienić tablicę na obiekt osoby. Możesz użyć ArrayIterator Class.
Teraz masz obiekt iteratora.
Utwórz klasę rozszerzającą klasę FilterIterator; gdzie musisz zdefiniować metodę abstrakcyjną. Podążaj za przykładem
Powyższa impelmentacja wiąże właściwość tylko wtedy, gdy istnieje ona w klasie.
Dodaj jeszcze jedną metodę w klasie PersonIterator
Upewnij się, że masz mutatory zdefiniowane w swojej klasie. Teraz możesz wywołać te funkcje w miejscu, w którym chcesz utworzyć obiekt.
źródło
rekursja jest twoim przyjacielem:
źródło
Wymaga to PHP7, ponieważ zdecydowałem się użyć funkcji lambda, aby zablokować „innerfunc” w głównej funkcji. Funkcja lambda jest wywoływana rekurencyjnie, stąd potrzeba: „use (& $ innerfunc)”. Możesz to zrobić w PHP5, ale nie możesz ukryć funkcji wewnętrznej.
źródło
użyj tej funkcji, którą wykonałem:
Stosowanie:
źródło
jedna wkładka
źródło
x
w tablicy zawiera odniesienie do innej tablicy. Wtedy$object->x
po wykonaniu jednej linijki będzie duplikat$result_array['x']
, a nie identyczna tablica.Łatwy:
Przykład:
Następnie spełnione są następujące warunki:
źródło
Możesz to również zrobić, dodając (obiekt) po lewej stronie zmiennej, aby utworzyć nowy obiekt.
http://codepad.org/9YmD1KsU
źródło
Korzystanie
json_encode
jest problematyczne ze względu na sposób, w jaki obsługuje dane inne niż UTF-8. Warto zauważyć, że metodajson_encode
/json_encode
pozostawia również tablice niesocjacyjne jako tablice. To może być lub nie być to, czego chcesz. Ostatnio byłem w stanie odtworzyć funkcjonalność tego rozwiązania, ale bez korzystania zjson_
funkcji. Oto, co wymyśliłem:źródło
Najlepsza metoda na świecie :)
jeśli użyjesz różnych metod, będziesz mieć problemy. To najlepsza metoda. Kiedykolwiek widziałeś.
źródło
Tablice wielowymiarowe w obiekt. ten kod służy do konwersji metody try-catch API API wyszukiwania Bing.
źródło
Możesz użyć Odbicia:
źródło
CakePHP ma rekurencyjną klasę Set :: map, która zasadniczo mapuje tablicę na obiekt. Może być konieczna zmiana wyglądu tablicy, aby obiekt wyglądał tak, jak chcesz.
http://api.cakephp.org/view_source/set/#line-158
W najgorszym przypadku możesz uzyskać kilka pomysłów z tej funkcji.
źródło
Oczywiście tylko ekstrapolacja odpowiedzi innych ludzi, ale oto funkcja rekurencyjna, która przekształci dowolną tablicę wymiarów ściółki w obiekt:
I pamiętaj, że jeśli tablica miała klawiszy numerycznych wciąż mogą się odwoływać w powstałym obiekcie przy użyciu
{}
(na przykład:$obj->prop->{4}->prop
)źródło
Zainspirowany wszystkimi tymi kodami, próbowałem stworzyć ulepszoną wersję z obsługą: konkretnej nazwy klasy, unikania metody konstruktora, wzorca „fasoli” i trybu ścisłego (ustaw tylko istniejące właściwości):
źródło
Kod
Ta funkcja działa tak samo jak
json_decode(json_encode($arr), false)
.Testowanie
Test 1: Płaski układ
Wynik:
Test 2: Szyk obiektów
Wynik:
Test 3: Obiekt
Wynik:
źródło
zrobiłem to w dość prosty sposób,
źródło