2016-06-14 7 views
0

У меня есть JSon дерево с категориями,Получение последнего уровня JSon дерева на PHP

Я хотел бы получить последний уровень элементов для каждой другой категории.

Например, на этой 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 
      } 
      ] 
     } 
     ] 
    } 
    ] 

Результат будет массив (футболки, джинсы, Маленькие Уши, сапоги, коктейль)

То, что я имел в виду, чтобы расшифровать его массив и поиск фильтруют массив со всеми категориями, которые являются нулевыми, но я не уверен, что это лучший вариант, потому что объект имеет разные уровни.

(я извиняюсь за английский)

+0

ну, да. вы должны сначала его расшифровать. php не знает, что такое json. это просто текст текста. и да, вы можете использовать array_filter() с соответствующим рекурсивным обратным вызовом для сканирования массива, но возвращение совпадений от этого рекурсивного вызова будет интересно, если вам нужно сохранить «путь», который вы берете через массив, чтобы найти совпадающий узел (с). –

+0

прямо сейчас я не сохраню путь, потому что я использую это, чтобы соответствовать своему собственному дереву на другой конечной точке, но я не знаю, будет ли делать фильтр наилучшей практикой или лучше использовать рекурсивную функцию, а не поскольку нулевое поле – Saikios

+0

Это даже не действительный JSON, и я не знаю, кто будет пытаться исправить его, чтобы проверить ответ. – AbraCadaver

ответ

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 строки в РНР 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

Вы можете сделать это с помощью рекурсивных итераторы.

$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'); 
    } 
} 

Это может быть не самый эффективный способ сделать это, но он делает код довольно простым.