在php上获取json树的最后一级

时间:2016-06-14 20:31:28

标签: php json schema.org

我有一个带有类别的json树,

我想获得每个不同类别的最后一级元素。

例如关于这个json:

 [
    {
      "category_id": "3",
      "parent_id": "2",
      "name": "Women",
      "categories": [
        {
          "category_id": "11",
          "parent_id": "3",
          "name": "Clothing",
          "categories": [
            {
              "category_id": "30",
              "parent_id": "11",
              "name": "T-shirts",
              "categories": null
            },
            {
              "category_id": "33",
              "parent_id": "11",
              "name": "jeans",
              "categories": null
            }
          ]
        }
      ]
    },
    {
      "category_id": "5",
      "parent_id": "2",
      "name": "Footwear ",
      "categories": [
        {
          "category_id": "15",
          "parent_id": "5",
          "name": "Rings",
          "categories": [
            {
              "category_id": "51",
              "parent_id": "15",
              "name": "Small Leathers",
              "categories": null
            }
          ]
        },
        {
          "category_id": "16",
          "parent_id": "5",
          "name": "Bands",
          "categories": [
            {
              "category_id": "41",
              "parent_id": "16",
              "name": "boots",
              "categories": null
            }
          ]
        },
        {
          "category_id": "48",
          "parent_id": "5",
          "name": "Bracelets",
          "categories": [
            {
              "category_id": "55",
              "parent_id": "48",
              "name": "Cocktail",
              "categories": null
            }
          ]
        }
      ]
    }
  ]

结果将是一个阵列(T恤,牛仔裤,小皮革,靴子,鸡尾酒)

我在想的是在数组上解码它并搜索过滤所有类别为nu​​ll的数组,但我不确定它是否是最佳选项,因为该对象具有不同的级别。

(我很抱歉英语)

2 个答案:

答案 0 :(得分:1)

Json字符串不是有效的。它可以通过将json字符串括在{}。

中来使其有效
$json = '{"categories": [
{
  "category_id": "3",
  "parent_id": "2",
  "name": "Women",
  "categories": [
    {
      "category_id": "11",
      "parent_id": "3",
      "name": "Clothing",
      "categories": [
        {
          "category_id": "30",
          "parent_id": "11",
          "name": "T-shirts",
          "categories": null
        },
        {
          "category_id": "33",
          "parent_id": "11",
          "name": "jeans",
          "categories": null
        }
      ]
    }
  ]
},
{
  "category_id": "5",
  "parent_id": "2",
  "name": "Footwear ",
  "categories": [
    {
      "category_id": "15",
      "parent_id": "5",
      "name": "Rings",
      "categories": [
        {
          "category_id": "51",
          "parent_id": "15",
          "name": "Small Leathers",
          "categories": null
        }
      ]
    },
    {
      "category_id": "16",
      "parent_id": "5",
      "name": "Bands",
      "categories": [
        {
          "category_id": "41",
          "parent_id": "16",
          "name": "boots",
          "categories": null
        }
      ]
    },
    {
      "category_id": "48",
      "parent_id": "5",
      "name": "Bracelets",
      "categories": [
        {
          "category_id": "55",
          "parent_id": "48",
          "name": "Cocktail",
          "categories": null
        }
      ]
    }
  ]
}
]}';

将json字符串解码为php opject

$json_object = json_decode($json);

使用此递归函数获取数组中所有最后一级的类别。

function getLastCategories($object){
        $last_categories = array();
        if(is_array($object->categories)){
            foreach($object->categories as $categories){
                $last_categories = array_merge( $last_categories, getLastCategories($categories));
            }
        }else{
            $last_categories[]=$object->name;
        }
        return $last_categories;
    }

print_r(getLastCategories($json_object));

输出:

Array
(
    [0] => T-shirts
    [1] => jeans
    [2] => Small Leathers
    [3] => boots
    [4] => Cocktail
)

答案 1 :(得分:1)

您可以使用递归迭代器来完成此操作。

$categories = json_decode($json);

// create the iterator    
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($categories));

// iterate recursively    
foreach ($iterator as $key => $subcategories) {

    // if the 'categories' key is empty for the current level...
    if ($key == 'categories' && !$subcategories) {

        // then add the value of the 'name' key for the current level to your result array.
        $result[] = $iterator->getSubIterator()->offsetGet('name');
    }
}

这可能不是最有效的方法,但它使代码非常简单。