Integruję interfejs API z moją witryną, która działa z danymi przechowywanymi w obiektach, podczas gdy mój kod jest zapisywany przy użyciu tablic.
Chciałbym, aby szybka i brudna funkcja przekształciła obiekt w tablicę.
Po prostu wybierz go
$array = (array) $yourObject;
Z tablic :
Jeśli obiekt zostanie przekonwertowany na tablicę, wynikiem jest tablica, której elementami są właściwości obiektu. Klucze to nazwy zmiennych składowych, z kilkoma istotnymi wyjątkami: właściwości liczb całkowitych są niedostępne; zmienne prywatne mają nazwę klasy wstawioną do nazwy zmiennej; zmienne chronione mają znak „*” dodany do nazwy zmiennej. Te poprzedzone wartości mają po każdej stronie bajty zerowe.
Przykład: prosty obiekt
$object = new StdClass;
$object->foo = 1;
$object->bar = 2;
var_dump( (array) $object );
Wynik:
array(2) {
'foo' => int(1)
'bar' => int(2)
}
Przykład: Obiekt złożony
class Foo
{
private $foo;
protected $bar;
public $baz;
public function __construct()
{
$this->foo = 1;
$this->bar = 2;
$this->baz = new StdClass;
}
}
var_dump( (array) new Foo );
Dane wyjściowe (dla jasności edytowano \ 0s):
array(3) {
'\0Foo\0foo' => int(1)
'\0*\0bar' => int(2)
'baz' => class stdClass#2 (0) {}
}
Wyjście z var_export
zamiast var_dump
:
array (
'' . "\0" . 'Foo' . "\0" . 'foo' => 1,
'' . "\0" . '*' . "\0" . 'bar' => 2,
'baz' =>
stdClass::__set_state(array(
)),
)
Rzutowanie w ten sposób nie spowoduje głębokiego rzutowania wykresu obiektowego i musisz zastosować bajty zerowe (jak wyjaśniono w cytacie ręcznym), aby uzyskać dostęp do niepublicznych atrybutów. Działa to najlepiej podczas rzutowania obiektów StdClass lub obiektów posiadających tylko właściwości publiczne. Dla szybkiego i brudnego (o co prosiłeś) jest w porządku.
Zobacz także ten szczegółowy post na blogu:
ArrayAccess
interfejs, być może w połączeniu z tym rozwiązaniem. php.net/manual/en/class.arrayaccess.php[1 => "one"]
Staje się["1" => "one"]
(array)
i(object)
działa niezawodnie i taka sama we wszystkich wersjach od PHP 4.3. Zobacz 3v4l.org/X6lhm . Jeśli pojawi się błąd składniowy, zrobiłeś coś złego.empty
. Nie można użyć wyrażeniaempty
wcześniejszego niż 5.5. Jest to całkowicie niezwiązane z rzutowaniem;)Możesz szybko przekonwertować głęboko zagnieżdżone obiekty na tablice asocjacyjne, polegając na działaniu funkcji kodowania / dekodowania JSON:
źródło
Od pierwszego hitu Google dla „ obiektu PHP do przypisania tablicy ” mamy to:
Źródło znajduje się na codenippets.joyent.com .
źródło
function objectToArray($o) { $a = array(); foreach ($o as $k => $v) $a[$k] = (is_array($v) || is_object($v)) ? objectToArray($v): $v; return $a; }
To po prostu ustawia wszystko, co nie jest obiektem ani tablicą i kontynuuje bez powtarzania przywołania metody, chyba że jest to konieczne.Jeśli właściwości obiektu są publiczne, możesz:
Jeśli są prywatne lub chronione, będą miały dziwne nazwy kluczy w tablicy. W takim przypadku będziesz potrzebować następującej funkcji:
źródło
Wynik
źródło
Oto kod:
źródło
Wszystkie pozostałe odpowiedzi zamieszczone tutaj działają tylko z atrybutami publicznymi. Oto jedno rozwiązanie, które działa z obiektami podobnymi do JavaBeans przy użyciu odbicia i getterów:
źródło
public
właściwości?Co
get_object_vars($obj)
? Wydaje się to przydatne, jeśli chcesz uzyskać dostęp tylko do publicznych właściwości obiektu.Zobacz get_object_vars .
źródło
Wpisz rzut obiektu na tablicę.
Rozwiąże twój problem.
źródło
Przede wszystkim, jeśli potrzebujesz tablicy z obiektu, prawdopodobnie najpierw powinieneś utworzyć dane jako tablicę. Pomyśl o tym.
Nie używaj
foreach
instrukcji ani transformacji JSON. Jeśli to planujesz, ponownie pracujesz ze strukturą danych, a nie z obiektem.Jeśli naprawdę tego potrzebujesz, zastosuj podejście obiektowe, aby mieć czysty i łatwy do utrzymania kod. Na przykład:
Obiekt jako tablica
Jeśli potrzebujesz wszystkich właściwości, użyj obiektu przesyłania:
źródło
Możesz łatwo użyć tej funkcji, aby uzyskać wynik:
Użyj PHP 5 lub nowszego.
źródło
Oto moja rekurencyjna funkcja PHP do konwersji obiektów PHP na tablicę asocjacyjną:
Przykład użycia:
źródło
$new_arr1 = (array) $my_object;
Aby przekonwertować obiekt na tablicę, po prostu rzuć go jawnie:
źródło
Możesz również utworzyć funkcję w PHP do konwersji tablicy obiektów:
źródło
Możesz to zrobić, gdy pozyskujesz dane jako obiekty z baz danych:
źródło
Funkcja niestandardowa do konwersji stdClass na tablicę:
Kolejna niestandardowa funkcja do konwersji tablicy na stdClass:
Przykład użycia:
źródło
Posługiwać się:
Zwraca tablicę bez znaków specjalnych i nazw klas.
źródło
Ta odpowiedź jest tylko połączeniem różnych odpowiedzi tego postu, ale jest rozwiązaniem do konwersji obiektu PHP o właściwościach publicznych lub prywatnych o prostych wartościach lub tablicach na tablicę asocjacyjną ...
źródło
Kilka ulepszeń w kodzie „dobrze znanym”
Zauważ, że jeśli funkcja należy do klasy (jak wyżej), musisz zmienić
__FUNCTION__
na__METHOD__
źródło
Możesz również użyć komponentu Serializer Symfony
źródło
W twoim przypadku dobrze / pięknie byłoby użyć wzorów „dekoratora” lub „transformacji modelu daty”. Na przykład:
Twój model
Dekorator
Stosowanie
Więc będzie piękniejszy i bardziej poprawny kod.
źródło
Konwertowanie i usuwanie denerwujących gwiazd:
Prawdopodobnie będzie to tańsze niż używanie odbić.
źródło
Krótkie rozwiązanie @ SpYk3HH
źródło
Ponieważ wiele osób znajduje to pytanie z powodu problemów z dynamicznym dostępem do atrybutów obiektu, po prostu zaznaczę, że możesz to zrobić w PHP:
$valueRow->{"valueName"}
W kontekście (usunięto dane wyjściowe HTML dla czytelności):
źródło
Za pomocą rzutowania możesz rozwiązać problem. Po prostu dodaj następujące linie do zwracanego obiektu:
Możesz także dodać do niego nową parę klucz i wartość, używając:
źródło
Myślę, że dobrym pomysłem jest użycie cech do przechowywania logiki konwersji obiekt na tablicę. Prosty przykład:
źródło
źródło
Tutaj stworzyłem metodę objectToArray () , która działa również z obiektami rekurencyjnymi, na przykład kiedy
$objectA
zawiera,$objectB
który punkt wskazuje ponownie$objectA
.Dodatkowo ograniczyłem wyniki do właściwości publicznych za pomocą ReflectionClass. Pozbądź się tego, jeśli go nie potrzebujesz.
Aby zidentyfikować już używane obiekty, używam chronionej właściwości w tej (abstrakcyjnej) klasie o nazwie
$this->usedObjects
. Jeśli zostanie znaleziony rekurencyjny obiekt zagnieżdżony, zostanie on zastąpiony łańcuchem**recursive**
. W przeciwnym razie zawiodłoby z powodu nieskończonej pętli.źródło
$usedObjects
nie jest inicjowany na początku, więc wielokrotne wywołanie tego spowoduje nieprawidłowe wyniki w późniejszych wywołaniach. Ponadto nie zwalniasz go na końcu, więc twoje obiekty nigdy nie zostaną usunięte z pamięci.Oto moja propozycja, jeśli masz obiekty w obiektach z nawet prywatnymi członkami:
źródło
Używam tego (potrzebne rozwiązanie rekurencyjne z odpowiednimi kluczami):
Przykład użycia, następujący kod:
Wydrukuje to:
źródło