0

PHP には、属性のコレクションを含む製品オブジェクトがあります。json_encode はこれを生成します:

{"id":"123","name":"abc","attributes":{"attributes":[{"key":"sku","value":"xyz"}]}}

2 回リストされている「属性」は冗長です。JSONがきれいになるようにオブジェクトコレクションを構造化する最良の方法は何ですか?

class Product {

    public $id;
    public $name;
    public $attributes;

    public function __construct()
    {
        $this->attributes = new Attributes();
    }

    public function get($id)
    {
        $this->id = "123";
        $this->name = "abc";
        $attribute = new Attribute("sku", "xyz");
        $this->attributes->add($attribute);
    }
}

class Attributes
{
    public $attributes;

    public function __construct()
    {
        $this->attributes = array();
    }

    public function add($attribute)
    {
        array_push($this->attributes, $attribute);
    }
}

class Attribute
{
    public $key;
    public $value;

    public function __construct($key, $value)
    {
        $this->set($key, $value);
    }
}
4

2 に答える 2

1

JsonSerializableを実装することで、クラスにカスタム json エンコーディング形式を指定できます。

あなたの場合、Attributesにそれを実装させ、$this->attributesを返すjsonSerializeメソッドを与えるだけです。

于 2012-08-22T06:50:27.990 に答える
1

連想配列を使用するだけです。

class Product {
...
    public $attributes=array();
    ...
    public function get($id)
    {
        ...
        $this->attributes["sku"]="xyz";
        $this->attributes["foo"]="bar";
    }
}

json_encode() は次のようなものを生成する必要があります。

{"id":"123","name":"abc","attributes":{"sku":"xyz","foo":"bar"}}

または可変変数を使用:

class Attributes
{
    public function add($key,$value)
    {
        $this->{$key}=$value;
    }
    public function drop($key)
    {
        unset($this->{$key});
    }
}

$a=new Attributes();
$a->add('sku','xyz');
$a->add('foo','bar');
echo json_encode($a).'<br>';
$a->drop('sku');
echo json_encode($a).'<br>';

出力:

{"sku":"xyz","foo":"bar"}
{"foo":"bar"}
于 2012-08-22T06:58:08.070 に答える