2

私は実際に複雑な配列を操作して操作をより簡単にするクラスを持っています。元の配列の形式は次のようになります。

array(
    array(
        "name" =>"foo",
        "type" =>8,         //The array is NBT format and 8 stands for string
        "value" =>"somevalue"
    )
}

このクラスは、上記のような配列をコンストラクターとして受け取ります。

class NBT_traverser implements ArrayAccess {
    function __construct(&$array) {
       $this->array = $array;
    }
}

次に、メンバーにアクセスする方法は次のとおりです。

$parser = new NBT_traverser($somearray);   
echo $parser["foo"];  //"somevalue"   

クラスをprint_R取得すると、その値のリストと元の複雑な配列が取得されます。このような:

 object(NBT_traverser)#2 (1) { 
    ["nbt":"NBT_traverser":private]=> &array(1) {
 /*Tons of ugly array contents*/
 }

代わりに、次の出力のように取得したいと思いますprint_r

array(
    "foo" => "somevalue"
)

これを行うためにだますことは可能print_rですか?現在の動作では、クラスを使用しない場合よりも、クラスを使用してデバッグする方が難しくなっています。
もちろん、独自のメソッドを作成して印刷することもできますが、クラスのユーザーにとって使用法をより簡単にしたいと考えています。print_R代わりに、配列として出力される何かを与えたかったのです。

4

2 に答える 2

2

ArrayAccess値を取得するメソッドを作成するだけで拡張している場合、問題は発生しないはずです

$random = range("A", "F");
$array = array_combine($random, $random);

$parser = new NBT_traverser($array);
echo $parser->getPrint();

出力

Array
(
    [A] => A
    [B] => B
    [C] => C
    [D] => D
    [E] => E
    [F] => F
)

使用クラス

class NBT_traverser implements ArrayAccess {
    private $used; // you don't want this
    protected $ugly = array(); // you don't want this
    public $error = 0202; // you don't want this
    private $array = array(); // you want this
    function __construct(&$array) {
        $this->array = $array;
    }

    function getPrint() {
        return print_r($this->array, true);
    }

    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->array[] = $value;
        } else {
            $this->array[$offset] = $value;
        }
    }

    public function offsetExists($offset) {
        return isset($this->array[$offset]);
    }

    public function offsetUnset($offset) {
        unset($this->array[$offset]);
    }

    public function offsetGet($offset) {
        return isset($this->array[$offset]) ? $this->array[$offset] : null;
    }
}
于 2013-03-29T20:50:10.203 に答える
1

クラスで __toString 関数を使用できます

class Test
{
    private $_array = array();

    public function __toString()
    {
        return print_r($this->_array, true);
    }
}

そして、あなたのクラスをエコーアウトするだけです

$test = new Test();
echo $test;

これにより、配列が希望どおりに出力されると思いますか?

Array
(
)
于 2013-03-29T21:32:27.193 に答える