7

重複の可能性:
数値キーをオブジェクトとして持つ配列をキャストする

(object)型キャストについて考えていました。

連想配列をオブジェクトに変換するなど、多くの便利なことを行うことができます。また、スカラー値をオブジェクトに変換するなど、あまり役に立たず、少し面白い(IMHO)こともできます。

しかし、インデックス付き配列のキャストの結果にアクセスするにはどうすればよいですか?

// 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が動的に実装されCountable、次のように機能するため、次のように機能しArrayAccessます。

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

1 に答える 1

3

これは実際に報告されたバグです。

これは「修正するには費用がかかりすぎる」と見なされ、解決策は「この役に立たない癖を説明するためにドキュメントを更新したため、正式に正しい動作になりました」[1]

ただし、いくつかの回避策があります。

何も得られないのでget_object_vars、できることは次のとおりです。

  1. stdClass使用を繰り返すことができますforeach
  2. 配列としてキャストバックできます。
  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'); 
于 2012-09-01T14:31:33.990 に答える