Задать вопрос
@im_dimas

Как структурировать данные категорий при парсинге?

Добрый вечер. Возникла сложность при парсинге категорий. Перейду сразу к делу.
Есть примерно такой массив со ссылками:
Каждая строка это отдельный элемент массива
/category0/subcat1/subcat2
/category0/subcat1/subcat4
/category0/subcat5/subcat6
/category2/subcat7/subcat8
/category2/subcat9/subcat10
/category2/subcat11/subcat12
....

/categoryN1/subcatN2/subcatN3


Как привести этот массив в более удобный для внесения в базу данных категорий (с родительскими и дочерними категориями), например в:
array(
"category0"=>array(
"subcat1"=>array("subcat2","subcat4"),
"subcat5"=>array("subcat6")
),
);
//И так далее...

Или в виде JSON
{

    "category0":{
        "subcat1":[
            "subcat2",
            "subcat4"
        ],
        "subcat5":[
            "subcat6"
        ]
    }

}
  • Вопрос задан
  • 152 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 3
@rapidum_alder
Решение Неандертальца::

$arr = [
    '/category0/subcat1/subcat2',
    '/category0/subcat1/subcat4',
    '/category0/subcat5/subcat6',
    '/category2/subcat7/subcat8',
    '/category2/subcat9/subcat10',
    '/category2/subcat11/subcat12',
];

$t = [];
foreach ($arr as $item) {
    $s = explode('/', $item);
    $i = $s[1];
    unset ($s[1], $s[0]);
    if (!$t[$i] ){
        $t[$i] = [];
    }
    foreach ($s as $item){
        array_push ( $t[$i],$item);
    }
}
foreach ($t as &$item){
    $item = array_unique($item);
}
echo('<pre>');
var_dump($t);
var_dump(json_encode($t));
echo('<pre>');
Ответ написан
Комментировать
@generate
...
$arr =  array(
    '/category0/subcat1/subcat2',
    '/category0/subcat1/subcat4',
    '/category0/subcat5/subcat6',
    '/category2/subcat7/subcat8',
    '/category2/subcat9/subcat10',
    '/category2/subcat11/subcat12'
);

foreach ($arr as $key => $value) {
preg_match_all('#/category(\d+)/subcat(\d+)/subcat(\d+)#', $value, $newmatch);
$cats[] = array('category' => $newmatch[1][0], 'subcat' => $newmatch[2][0],  'subcat_' => $newmatch[3][0]);
unset($newmatch);
}

print_r($cats);

Результат
Array
(
    [0] => Array
        (
            [category] => 0
            [subcat] => 1
            [subcat_] => 2
        )

    [1] => Array
        (
            [category] => 0
            [subcat] => 1
            [subcat_] => 4
        )

    [2] => Array
        (
            [category] => 0
            [subcat] => 5
            [subcat_] => 6
        )

    [3] => Array
        (
            [category] => 2
            [subcat] => 7
            [subcat_] => 8
        )

    [4] => Array
        (
            [category] => 2
            [subcat] => 9
            [subcat_] => 10
        )

    [5] => Array
        (
            [category] => 2
            [subcat] => 11
            [subcat_] => 12
        )

)
Ответ написан
Комментировать
@rPman
Сначала нужно задаться очень важным вопросом, а как именно у вас будут использоваться категории? А то наворотите многоуровневую систему, а потом поверх этого будете реализовывать почти поиск по ключевым словам и не больше (т.е. только по названию категории без учета ее уровня вложенности).

Базу данных необходимо в первую очередь строить исходя не из того что там хранится, а как это будет использоваться!

К примеру мне нравится система, когда категория - это всего навсего метка/тег/ключевое слово, которое приписывается объекту, т.е. :
справочник категорий (id,name,level,..)
== 1-M ==
    V
категории объектов(id_категория,id_объекта)
    ^
== M-1 ==
объекты (id,...)

числовое поле level может находиться не в справочнике, а в таблице категории_объектов, если одна и та же категория может находиться у разных объектов на разных уровнях (либо придется заводить несколько одноименных категорий, каждую для своего уровня)

Тут же можно в/рядом со справочником категорий хранить информацию по лимитам, взаимосвязей категорий и требованиям (например количество категорий всегда 3 или возможны объекты только с 1 корневой?)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы