Laravel php获取多维数组

时间:2017-04-07 00:13:40

标签: php arrays json laravel-5

我有以下json文件,其中包含产品详细信息:

  "products": [
    {
      "sku": 123,
      "name": "iphone 7",
      "categoryPath": [
        {
          "id": "abcat0800000",
          "name": "Cell Phones"
        },
        {

          "id": "pcmcat209400050001",
          "name": "All Cell Phones with Plans"

        }
      ],
}
]

我只想存储categoryPath数组的最后一个值(ID和NAME):

          "id": "pcmcat209400050001",
          "name": "All Cell Phones with Plans"

我当前的代码获取json文件,解码json并在products表中插入信息。

    $json = File::get("/json/cell-0.json");
    $data = json_decode($json);
    $array1 = (array)$data;
    //table products
    foreach ($array1['products'] as $obj) {
        DB::table('products')->insert(array(
            'productSku' => ((isset($obj->sku) ? $obj->sku : 1)),
            'productName' => ((isset($obj->name) ? $obj->name : null)),
            'categoryId' => end($obj->categoryPath->id),
            'categoryName' => end($obj->categoryPath->name)
        ));

考虑到array-> categoryPath有多个字段我想使用一个函数(例如:end()),以便只获取最后一个值的id和名称。

使用end($ obj-> categoryPath-> id)我收到以下错误 - >

  

尝试修改非对象的属性

这是检索多维数组的最后一个值的最佳方法吗?

2 个答案:

答案 0 :(得分:1)

您获取最后一个元素的方式不正确,这里是重构的代码。我也消除了将数据转换为数组的需要。

$json = File::get("/json/cell-0.json");
$data = json_decode($json, true);
//table products
foreach ($data['products'] as $product) {
    $lastCategory = isset($product['categoryPath']) && $size = sizeof($product['categoryPath']) ? $product['categoryPath'][$size-1] : array('id' => null, 'name' => null);
    DB::table('products')->insert(
        array(
            'productSku' => isset($product['sku']) ? $product['sku'] : 1,
            'productName' => isset($product['name']) ? $product['name'] : null,
            'categoryId' => lastCategory['id'],
            'categoryName' => lastCategory['name']
        )
    );
}

答案 1 :(得分:1)

你可以使用end()但你的访问者必须在end()调用之外(未经测试):

    foreach ($array1['products'] as $obj) {

    DB::table('products')->insert(array(
        'productSku' => ((isset($obj->sku) ? $obj->sku : 1)),
        'productName' => ((isset($obj->name) ? $obj->name : null)),
        'categoryId' => end($obj->categoryPath)->id,
        'categoryName' => end($obj->categoryPath)->name
    ));