iNickolay
@iNickolay

Почему функция поиска родителей отрабатывает по разному?

Доброго дня вам!
Столкнулся с проблемой, от которой уже мозги кипят:

В первом случае получаю данные из бд, вот var_dump() данных:
spoiler
array(3) {
  [0]=>
  array(8) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(20) "Информация"
    ["set_id"]=>
    int(1)
    ["is_category"]=>
    int(1)
    ["code"]=>
    string(11) "information"
    ["sort"]=>
    int(10)
    ["parent_id"]=>
    int(0)
    ["level"]=>
    int(0)
  }
  [1]=>
  array(8) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(9) "О нас"
    ["set_id"]=>
    int(1)
    ["is_category"]=>
    int(1)
    ["code"]=>
    string(5) "about"
    ["sort"]=>
    int(10)
    ["parent_id"]=>
    int(2)
    ["level"]=>
    int(1)
  }
  [2]=>
  array(8) {
    ["id"]=>
    int(12)
    ["name"]=>
    string(14) "История"
    ["set_id"]=>
    int(1)
    ["is_category"]=>
    int(0)
    ["code"]=>
    string(7) "history"
    ["sort"]=>
    int(10)
    ["parent_id"]=>
    int(3)
    ["level"]=>
    int(2)
  }
}


Вот для сравнения var_dump() рабочего массива:
spoiler
array(7) {
  [0]=>
  array(4) {
    ["id"]=>
    int(1)
    ["parent_id"]=>
    string(0) ""
    ["name"]=>
    string(4) "NODE"
    ["payment"]=>
    int(1)
  }
  [1]=>
  array(4) {
    ["id"]=>
    int(2)
    ["parent_id"]=>
    int(1)
    ["name"]=>
    string(6) "NODE 1"
    ["payment"]=>
    int(1)
  }
  [2]=>
  array(4) {
    ["id"]=>
    int(4)
    ["parent_id"]=>
    int(2)
    ["name"]=>
    string(8) "NODE 1-1"
    ["payment"]=>
    int(0)
  }
  [3]=>
  array(4) {
    ["id"]=>
    int(5)
    ["parent_id"]=>
    int(4)
    ["name"]=>
    string(10) "NODE 1-1-1"
    ["payment"]=>
    int(0)
  }
  [4]=>
  array(4) {
    ["id"]=>
    int(6)
    ["parent_id"]=>
    int(4)
    ["name"]=>
    string(10) "NODE 1-1-2"
    ["payment"]=>
    int(0)
  }
  [5]=>
  array(4) {
    ["id"]=>
    int(3)
    ["parent_id"]=>
    int(1)
    ["name"]=>
    string(6) "NODE 2"
    ["payment"]=>
    int(0)
  }
  [6]=>
  array(4) {
    ["id"]=>
    int(7)
    ["parent_id"]=>
    int(3)
    ["name"]=>
    string(8) "NODE 2-1"
    ["payment"]=>
    int(0)
  }
}


Сам код:
function getBranches($arr, $id) {
    $childrenArr = array();
    foreach($arr as $item) {
        if ($item['parent_id']==$id) {
            $childrenArr[] = $item;
        }
    }
    return $childrenArr;
}

function getBranch($arr, $id) {
    $branch = array();
    foreach($arr as $item) {

        if ($item['id'] == $id) {
            $branch[$item['id']] = $item;
            $branches = getBranches($arr, $id);
            $children = array();
            foreach($branches as $child) {
                $b = getBranch($arr, $child['id']);
                foreach ($b as $token => $child) {
                    $children[$child['id']] = $child;
                }
            }
            $branch[$item['id']]['children'] = $children;
            break;
        }
    }
    if (count($branch)==0) echo 'WARNING '.$id;
    return $branch;
}
(ссылка на песочницу)

Для рабочего варианта var_dump(getBranch($users,1)) выглядит так:
spoiler
array(1) {
  [1]=>
  array(5) {
    ["id"]=>
    int(1)
    ["parent_id"]=>
    string(0) ""
    ["name"]=>
    string(4) "NODE"
    ["payment"]=>
    int(1)
    ["children"]=>
    array(2) {
      [2]=>
      array(5) {
        ["id"]=>
        int(2)
        ["parent_id"]=>
        int(1)
        ["name"]=>
        string(6) "NODE 1"
        ["payment"]=>
        int(1)
        ["children"]=>
        array(1) {
          [4]=>
          array(5) {
            ["id"]=>
            int(4)
            ["parent_id"]=>
            int(2)
            ["name"]=>
            string(8) "NODE 1-1"
            ["payment"]=>
            int(0)
            ["children"]=>
            array(2) {
              [5]=>
              array(5) {
                ["id"]=>
                int(5)
                ["parent_id"]=>
                int(4)
                ["name"]=>
                string(10) "NODE 1-1-1"
                ["payment"]=>
                int(0)
                ["children"]=>
                array(0) {
                }
              }
              [6]=>
              array(5) {
                ["id"]=>
                int(6)
                ["parent_id"]=>
                int(4)
                ["name"]=>
                string(10) "NODE 1-1-2"
                ["payment"]=>
                int(0)
                ["children"]=>
                array(0) {
                }
              }
            }
          }
        }
      }
      [3]=>
      array(5) {
        ["id"]=>
        int(3)
        ["parent_id"]=>
        int(1)
        ["name"]=>
        string(6) "NODE 2"
        ["payment"]=>
        int(0)
        ["children"]=>
        array(1) {
          [7]=>
          array(5) {
            ["id"]=>
            int(7)
            ["parent_id"]=>
            int(3)
            ["name"]=>
            string(8) "NODE 2-1"
            ["payment"]=>
            int(0)
            ["children"]=>
            array(0) {
            }
          }
        }
      }
    }
  }
}

Т.е. создаёт правильную структуру.

А вот для var_dump(getBranch($users2,12)) данных из базы - берёт только активный элемент:
spoiler
array(1) {
  [12]=>
  array(9) {
    ["id"]=>
    int(12)
    ["name"]=>
    string(14) "История"
    ["set_id"]=>
    int(1)
    ["is_category"]=>
    int(0)
    ["code"]=>
    string(7) "history"
    ["sort"]=>
    int(10)
    ["parent_id"]=>
    int(3)
    ["level"]=>
    int(2)
    ["children"]=>
    array(0) {
    }
  }
}


В чём может быть подвох? Весь вечер убил - на пойму в чём может быть дело :(

Или подскажите рабочий код поиска родителей по полю parent_id.
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
iNickolay
@iNickolay Автор вопроса
Проблема решилась написанием другой функции:
$users = [
  // DB Data
];
$arr = [];

function findParent($haystack, $needle) {
    foreach ($haystack as $item) {
        if ($item['id'] == $needle) return $item;
    }
}

function makeParentTree($haystack, $array, $needle) {
    foreach ($haystack as $key => $item) {
        if ($item['id'] == $needle && $item['parent_id'] == 0 ) {
            $root = $item;
            $root['children'] = $array;
            $array = $root;
        } else if ($item['id'] == $needle) {
            $array = findParent($haystack, $item['parent_id']);
            $array['children'] = $item;
            $array = makeParentTree($haystack, $array, $array['parent_id']);
            break;
        }
    }
    return $array;
}

var_dump(makeParentTree($users, $arr, 4));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
rim89
@rim89
программист-велосипедист
Или подскажите рабочий код поиска родителей по полю parent_id.

SELECT * FROM table_name WHERE parent_id = some_id;
Ответ написан
Ваш ответ на вопрос

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

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