2012-09-01 16 views
7

Możliwe Duplikat:
Casting an Array with Numeric Keys as an ObjectKonwersja do object indeksowaną

Zastanawiałem (object) typu odlewów.

Jest możliwe, aby zrobić wiele pożytecznych rzeczy, jak konwersja tablicy asocjacyjnej do obiektu, a niektóre nie tak użyteczne i nieco zabawne (IMHO) rzeczy, jak converting a scalar value to object.

Ale w jaki sposób mogę uzyskać dostęp do wyniku rzutowania tablicy indeksowanej?

// Converting to object an indexed array 
$obj = (object) array('apple', 'fruit'); 

Co powiesz na dostęp do określonej wartości?

print $obj[0];  // Fatal error & doesn't have and any sense 
print $obj->scalar[0]; // Any sense 
print $obj->0;  // Syntax error 
print $obj->${'0'};  // Fatal error: empty property. 
print_r(get_object_vars($obj)); // Returns Array() 

print_r($obj); /* Returns 
        stdClass Object 
        (
          [0] => apple 
          [1] => fruit 
        ) 
        */ 

następujące prace, ponieważ stdClass narzędzia dynamicznie Countable i ArrayAccess:

foreach($obj as $k => $v) { 
    print $k . ' => ' . $v . PHP_EOL; 
} 

Odpowiedz

3

To jest rzeczywiście reported bug.

Została ona uznana za „zbyt drogie, aby naprawić” i rozdzielczość ma został „zaktualizowana dokumentacja do opisania tego bezużytecznego dziwactwo, więc jest teraz oficjalnie poprawne zachowanie” [1].

Istnieje jednak kilka obejść obejścia.

Jak get_object_vars daje nic, jedyne co można zrobić, to:

  1. Można iteracyjne na stdClass użyciu foreach
  2. Można rzucić go jako tablicę.
  3. , które można zmieniać oddanych do obiektu za pomocą json_decode + json_encode (to świństwo)

Przykład 1 .:

$obj = (object) array('apple', 'fruit'); 
foreach($obj as $key => $value) { ... 

Przykład 2 .:

$obj = (object) array('apple', 'fruit'); 
$array = (array) $obj; 
echo $array[0]; 

Przykład 3.:

$obj = (object) array('apple', 'fruit');  
$obj = json_decode(json_encode($obj));  
echo $obj->{'0'}; 
var_dump(get_object_vars($obj)); // array(2) {[0]=>string(5) "apple"[1]=>string(5)"fruit"} 

To dlatego nie należy rzucać non-asocjacyjną jako przedmiot :)

Ale jeśli chcesz, zrób to w ten sposób:

// PHP 5.3.0 and higher 
$obj = json_decode(json_encode(array('apple', 'fruit'), JSON_FORCE_OBJECT)); 
// PHP 5 >= 5.2.0 
$obj = json_decode(json_encode((Object) array('apple', 'fruit'))); 

zamiast z

$obj = (Object) array('apple','fruit'); 
+0

Dzięki za odpowiedź. Wiem, że to jest brudne i nigdy nie rzucę indeksowanej tablicy ... ale jestem ciekawy :-) Szukałem _clean_ sposobu, aby to zrobić, a nie tylko obejścia. Po tym, jak [Mattew] (http://stackoverflow.com/users/259778/matthew) zauważył mnie o zduplikowanym pytaniu, przeczytałem zaakceptowaną odpowiedź i zaproponowałem ci edycję. –

Powiązane problemy