如何创建嵌套的PHP值对象? (类)

时间:2011-09-06 15:02:00

标签: php arrays class

我想使用类语法创建以下内容:

$resp = new stdclass;

$resp->CategoryListResp->category[0]->categoryId = 1;
$resp->CategoryListResp->category[0]->categoryName = "Spel"; 
$resp->CategoryListResp->category[0]->iconUri = "PictoSpel.png";

$resp->CategoryListResp->category[1]->categoryId = 2;
$resp->CategoryListResp->category[1]->categoryName = "Transport";
$resp->CategoryListResp->category[1]->iconUri = "PictoTransport.png";

应该很简单,但我找不到这个的语法。 我稍后会以json格式输出$ resp。我知道我也可以使用数组...

json输出应为:

{"CategoryListResp":{"category":[{"categoryId":1,"categoryName":"Spel","iconUri":"PictoSpel.png"},{"categoryId":2,"categoryName":"Transport","iconUri":"PictoTransport.png"}]}}

3 个答案:

答案 0 :(得分:4)

你已经差不多了:

$resp = new stdClass();
$resp->CategoryListResp = new stdClass();

$resp->CategoryListResp->category[0]->categoryId = 1;
$resp->CategoryListResp->category[0]->categoryName = "Spel"; 
$resp->CategoryListResp->category[0]->iconUri = "PictoSpel.png";

$resp->CategoryListResp->category[1]->categoryId = 2;
$resp->CategoryListResp->category[1]->categoryName = "Transport";
$resp->CategoryListResp->category[1]->iconUri = "PictoTransport.png";

print_r(json_encode($resp));

/* 
output:
{"CategoryListResp":{"category":[{"categoryId":1,"categoryName":"Spel","iconUri":"PictoSpel.png"},{"categoryId":2,"categoryName":"Transport","iconUri":"PictoTransport.png"}]}}
*/

只需将$resp发送给json_encode即可。但是,您的代码应该按原样运行。为CategoryListRespCategory创建类定义更好的设计,而不仅仅是使用stdClass

答案 1 :(得分:4)

您还可以使您的课程更加明确:

    class Category {
        public $categoryId = 0, $categoryName = '', $iconUri = '';
    }

    class Resp {
        public $categoryListResp = null;
        public function __construct() {
            $this->categoryListResp = new CategoryListResp();
        }
    }

    class CategoryListResp {
        public $category = array();
    }

    $resp = new Resp();
    $resp->categoryListResp->category[0]->categoryId = 1; 
    $resp->categoryListResp->category[0]->categoryName = "Spel";  
    $resp->categoryListResp->category[0]->iconUri = "PictoSpel.png"; 
    // etc.

ADDED(根据henq的评论)。要充分利用类概念,您需要向类添加一些方法。那么你不会对数组使用->,而是调用相应的方法。 E.g。

class Category {
    public $categoryId = 0, $categoryName = '', $iconUri = '';
    public function __construct($id, $name, $icon) {
        $this->categoryId = $id;
        $this->categoryName = $name;
        $this->iconUri = $icon;
    }
}

class Resp {
    public $categoryListResp = null;
    public function __construct() {
        $this->categoryListResp = new CategoryListResp();
    }
    public function addCategory($index, $id, $name, $icon) {
        $this->categoryListResp->addCategory($index, $id, $name, $icon);
    }
}

class CategoryListResp {
    public $category = array();
    public function addCategory($index, $id, $name, $icon) {
        $this->category[$index] = new Category($id, $name, $icon);
    }
}

$resp = new Resp();        
$resp->addCategory(0, 1, "Spel", "PictoSpel.png");
$resp->addCategory(1, 2, "Transport", "PictoTransport.png");
// etc

您可以根据需要修改此概念。

答案 2 :(得分:3)

阵列是更简单的方法(正如@ felix-kling所建议的那样)

这就是代码结束的方式:

$resp = array(
  'CategoryListResp' => array(
    'category' => array(
      array(
        'categoryId'   => 1,
        'categoryName' => 'Spel',
        'iconUri'      => 'PictoSpel.png'
      ),
      array(
        'categoryId'   => 2,
        'categoryName' => 'Transport',
        'iconUri'      => 'PictoTransport.png'
      ),
    ),
  ),
);

print json_encode($resp);

清洁简单。