2012-02-07 16 views
10

mam tablicę wielowymiarową:jak przekonwertować tablicę wielowymiarową na obiekt w php?

$image_path = array('sm'=>$sm,'lg'=>$lg,'secondary'=>$sec_image); 

czarownica wygląda następująco:

[_media_path:protected] => Array 
      (
       [main_thumb] => http://example.com/e4150.jpg 
       [main_large] => http://example.com/e4150.jpg 
       [secondary] => Array 
        (
         [0] => http://example.com/e4150.jpg 
         [1] => http://example.com/e4150.jpg 
         [2] => http://example.com/e9243.jpg 
         [3] => http://example.com/e9244.jpg 
        ) 

      ) 

i chciałbym, aby przekształcić go w obiekt i zachować nazwy klawiszy.

Wszelkie pomysły?

Dzięki

edit: $obj = (object)$image_path; nie wydają się działać. Muszę inny sposób zapętlenie za pośrednictwem tablicy i tworzenie obiektu

+0

czy możesz dać nam lepszy przykład tego, jak chcesz wyglądać obiekt? czy chcesz zmienić klucze w właściwości? w jakim celu potrzebujesz obiektu? – mpen

+0

zamiast używać '[]', aby uzyskać wartość, potrzebuję użyć '->' – Patrioticcow

Odpowiedz

71

Szybkim sposobem na to jest:

$obj = json_decode(json_encode($array)); 

Wyjaśnienie

json_encode($array) przekształci całą tablicę wielowymiarową do ciąg JSON. (php.net/json_encode)

json_decode($string) skonwertuje ciąg JSON na obiekt stdClass. Jeśli przekażesz TRUE jako drugi argument do json_decode, otrzymasz z powrotem tablicę asocjacyjną. (php.net/json_decode)

Nie sądzę, że wydajność tutaj, rekurencyjnie przechodząca przez tablicę i konwersję wszystkiego jest bardzo zauważalna, chociaż chciałbym zobaczyć pewne benchmarki tego. Działa i nie zniknie.

+2

To powinno być odpowiedzią, ponieważ OP chce całej wielowymiarowej tablicy, a nie tablicy najwyższego poziomu. – AeroCross

+1

Powiedziałbym, że jest to powolny sposób na zrobienie tego.Jeśli wydajność jest problemem, uniknęłabym tego rozwiązania. –

+0

@CalebTaylor - Słyszę Cię. Nie jestem pewien co do benchmarków, ale jestem ciekawy, czy istnieje niebagatelna różnica między rekurencyjnie iteracyjną wielowymiarową tablicą i dodawaniem do obiektu (tj. Robieniem tego wszystkiego ręcznie) lub po prostu uruchomieniem powyższej sztuczki JSON . –

6

Najlepszym sposobem byłoby zarządzać swoją strukturę danych jako obiekt od początku, jeśli masz możliwość:

$a = (object) array(...); $a->prop = $value; //and so on 

ale najszybszym sposobem byłoby podejście dostarczane przez @CharlieS korzystając json_decode(json_encode($a)).

Można również uruchomić tablicę za pomocą funkcji rekursywnej, aby osiągnąć to samo. Nie porównałem tego z podejściem json, ale:

function convert_array_to_obj_recursive($a) { 
    if (is_array($a)) { 
     foreach($a as $k => $v) { 
      if (is_integer($k)) { 
       // only need this if you want to keep the array indexes separate 
       // from the object notation: eg. $o->{1} 
       $a['index'][$k] = convert_array_to_obj_recursive($v); 
      } 
      else { 
       $a[$k] = convert_array_to_obj_recursive($v); 
      } 
     } 

     return (object) $a; 
    } 

    // else maintain the type of $a 
    return $a; 
} 

Nadzieję, że pomaga.

EDIT: json_encode + json_decode utworzy obiekt zgodnie z potrzebami. Ale jeśli tablica była indeksami numerycznymi lub mieszanymi (np. array('a', 'b', 'foo'=>'bar')), nie będzie można odwoływać się do indeksów numerycznych z notacją obiektową (np. $ O-> 1 lub $ o [1]). powyższa funkcja umieszcza wszystkie indeksy numeryczne we właściwości 'index', która sama jest tablicą numeryczną. tak więc będziesz w stanie wykonać $o->index[1]. Zachowuje to rozróżnienie przekształconej tablicy od utworzonego obiektu i pozostawia opcję scalania obiektów, które mogą mieć właściwości liczbowe.

+0

Dzięki za zapewnienie funkcji rekursywnej, myślę, że jest to prawdopodobnie pomocne dla wielu osób, które się na to natkną. Zamierzam sprawdzić kod źródłowy PHP, aby zobaczyć, w jaki sposób json_encode/decode porównuje pod względem wydajności. Jestem ciekawy. –

+1

Możesz odwoływać się do właściwości liczbowych obiektów za pomocą '$ o -> {1}'. –

Powiązane problemy