Рекурсивная запись в массив

cWdop

Новичок
Здравствуйте!

Пытаюсь решить такую задачу, представим что есть товар в интернет магазине Т1, он находится в категорий К3, данная категория лежит в категорий К2, а К2 в К1 то есть:

ROOT
K1
K2
k3
T1

Нужно для каждого товара получить список его родительских категорий.

PHP:
foreach ($array_item_id as $key) {
    $result = get_parent($DBH, $key['id']); // $key - id товара
    var_dump($result);
}
function get_parent($DBH, $id) {
    $SELECT_PARENT = $DBH->prepare("SELECT parent FROM `modx_site_content` where id =?");
    $SELECT_PARENT->execute(array($id));
    $parent_id = $SELECT_PARENT->fetch();
   
    if($id != 85) { // 85 это ROOT
        $SELECT_PARENT = $DBH->prepare("SELECT parent FROM `modx_site_content` where id =?");
        $SELECT_PARENT->execute(array($id));
        $parent_id = $SELECT_PARENT->fetch();
        $parent[$id] = get_parent($DBH, $parent_id[0]);
        return $parent;
    } 
   
}
// результат такой:
array(1) {
  [1000]=>
  array(1) {
    [2150]=>
    array(1) {
      [2021]=>
      array(1) {
        [2018]=>
        NULL
      }
    }
  }
}
array(1) {
  [1001]=>
  array(1) {
    [2106]=>
    array(1) {
      [2022]=>
      array(1) {
        [2018]=>
        NULL
      }
    }
  }
}
Дело в том что я знаю что что то не так, будьте добры скажите мне как лучше сделать

Нужно что то типа 1001,2106,2022,2018, а у меня массив, а в нем куча массивов, или как его преобразовать?
 

sakon

П..и.н..ок
PHP:
function get_parent(&$a_child = array(),$id_parent = 85)
    {
        $rs=mysql_query("SELECT id, id_parent FROM modx_site_content WHERE id_parent='".$id_parent."' AND hidepage='show' ORDER BY pos,id_parent");
        if(mysql_num_rows($rs) > 0)
        {
            while($array=mysql_fetch_array($rs,MYSQL_ASSOC))
            {
                $a_child[$array['id']]=$array;
                $a_child[$array['id']]['child']=array();
                get_parent($a_child[$array['id']]['child'], $array['id']);
            }
        }
        else
        {
            unset($a_child[$id_parent]['child']);
        }
        return $a_child;
    }
 

cWdop

Новичок
Спасибо!

к стати можно и такой вариант применить:

PHP:
function get_hierarchy($DBH, $cat_id, $hierarchy = array()) {
    if ($cat_id == 85)
        return $hierarchy;
    $SELECT_PARENT = $DBH->prepare("SELECT parent FROM `modx_site_content` where id =?");
    $SELECT_PARENT->execute(array($cat_id));
    $data = $SELECT_PARENT->fetch();
 
    $res = get_hierarchy($DBH, $data['parent'], $hierarchy);
    $hierarchy += $res;
    $hierarchy[] = $data['parent'];
    return $hierarchy;
}
// Результат:
array(4) {
  [0]=>
  string(2) "85"
  [1]=>
  string(4) "2018"
  [2]=>
  string(4) "2021"
  [3]=>
  string(4) "2150"
}
array(4) {
  [0]=>
  string(2) "85"
  [1]=>
  string(4) "2018"
  [2]=>
  string(4) "2022"
  [3]=>
  string(4) "2106"
}
 

полудух

Итсист
больше рекурсий, больше запросов в базу, больше кода!
делаешь таблицу с категориями:
cat_id,name
и таблицу товаров:
item_id,name
а потом таблицу по правилам Нормальной Формы:
cat_id,item_id,deep
где deep это глубина вложения
 
Последнее редактирование:

полудух

Итсист
Нуу... Я даж и не знаю. Это какая из форм? :)
честно говоря - пофигу
главное, чтобы связи жили в отдельной таблице
за вторую запросто сойдёт
глубина там так, для красоты, можно по 1й, как обычно
но по глубине можно смотреть - искать дальше или нет.
а если вопрос стоит так:
Нужно для каждого товара получить список его родительских категорий.
то и запросы должны быть не "WHERE `id`=", а "WHERE `cat_id` IN (...)"
но бывает, что этим не ограничивается... тут вон народ аж до memory tables "на лету" дошёл :)

вообще-то делают таблицу под товар -> категория (1НФ) и таблицу под сами категории (parent_id,child_id - 1НФ)
потом делается SELECT `parent_id` FROM `cats` WHERE `parent_id` IN (SELECT `cat_id` FROM `items` WHERE `item_id`='59')
а у него по условию обе таблицы задействованы, но реализовано всё через одну + с извращениями

гугл всё это слышал не раз
 
Последнее редактирование:
Сверху