2012-09-01 15 views
7

可能性のある重複オブジェクトへの変換:
Casting an Array with Numeric Keys as an Objectは、インデックス付きの配列

私はおよそ(object)型キャストを思っていました。

これは、オブジェクトへの連想配列に変換するように、便利な多くのことを行うことは可能だし、converting a scalar value to objectのような、いくつかのそれほど有用ではないと(私見)の事少しおかしいです。

しかし、インデックス付き配列のキャスト結果にどうやってアクセスできますか?

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

特定の値にアクセスすることはどうですか?

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 
        ) 
        */ 

次作品stdClassは、動的にCountableArrayAccessを実装しているため:

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

答えて

3

これは実際reported bugです。

それは、「修正するにはあまりにも高価な」とみなされており、解像度は 「この役に立たない癖を説明する文書を更新し、それが が正式に正しい行動である」されている[1]

ただし、回避策があります。

get_object_varsはあなたに何も与えないので、あなたがすることができる唯一のことは、次のとおりです。

  1. あなたは配列としてそれをバックキャストできforeach
  2. を使用してstdClassに繰り返すことができます。
  3. あなたはjson_decode + json_encode(これは汚れたトリックである)

例を使用してオブジェクトにキャスト変更することができる1 .:

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

例2:

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

例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"} 

これは、あなたが

:)オブジェクトとして非連想配列をキャストしてはならない理由です。しかし、あなたがしたい場合は、この方法でそれを行うには:

// 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'))); 

の代わりに

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

お返事ありがとうございます。私はそれが汚れていることを知っていると私はインデックス配列をキャストすることはありません...しかし、私は不思議です:-)私は回避策だけでなく、これを行う_clean_方法を探していた。 [Mattew](http://stackoverflow.com/users/259778/matthew)が重複した質問について私に気づいた後、私は受け入れられた答えを読んで、あなたに編集を提案しました。 –

関連する問題