Получить parent_id категорий. PHP

есть массив:

array(3) {
  [0]=>
  array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(24) "Пользователи"
    ["alias"]=>
    string(5) "users"
    ["childrens"]=>
    array(3) {
      [0]=>
      array(3) {
        ["id"]=>
        int(2)
        ["name"]=>
        string(16) "Создание"
        ["alias"]=>
        string(6) "create"
      }
      [1]=>
      array(4) {
        ["id"]=>
        int(3)
        ["name"]=>
        string(12) "Список"
        ["alias"]=>
        string(4) "list"
        ["childrens"]=>
        array(2) {
          [0]=>
          array(3) {
            ["id"]=>
            int(4)
            ["name"]=>
            string(16) "Активные"
            ["alias"]=>
            string(6) "active"
          }
          [1]=>
          array(3) {
            ["id"]=>
            int(5)
            ["name"]=>
            string(18) "Удаленные"
            ["alias"]=>
            string(7) "deleted"
          }
        }
      }
      [2]=>
      array(3) {
        ["id"]=>
        int(8)
        ["name"]=>
        string(10) "Поиск"
        ["alias"]=>
        string(6) "search"
      }
    }
  }
  [1]=>
  array(4) {
    ["id"]=>
    int(6)
    ["name"]=>
    string(12) "Заявки"
    ["alias"]=>
    string(8) "requests"
    ["childrens"]=>
    array(3) {
      [0]=>
      array(3) {
        ["id"]=>
        int(9)
        ["name"]=>
        string(38) "Заявки на поключение"
        ["alias"]=>
        string(10) "connecting"
      }
      [1]=>
      array(3) {
        ["id"]=>
        int(10)
        ["name"]=>
        string(30) "Заявки на ремонт"
        ["alias"]=>
        string(7) "repairs"
      }
      [2]=>
      array(3) {
        ["id"]=>
        int(11)
        ["name"]=>
        string(28) "Заявки на обход"
        ["alias"]=>
        string(5) "round"
      }
    }
  }
  [2]=>
  array(4) {
    ["id"]=>
    int(7)
    ["name"]=>
    string(12) "Отчёты"
    ["alias"]=>
    string(7) "reports"
    ["childrens"]=>
    array(2) {
      [0]=>
      array(4) {
        ["id"]=>
        int(12)
        ["name"]=>
        string(31) "Отдел маркетинга"
        ["alias"]=>
        string(9) "marketing"
        ["childrens"]=>
        array(3) {
          [0]=>
          array(3) {
            ["id"]=>
            int(15)
            ["name"]=>
            string(34) "Отчёт по списаниям"
            ["alias"]=>
            string(10) "write-offs"
          }
          [1]=>
          array(3) {
            ["id"]=>
            int(16)
            ["name"]=>
            string(32) "Отчёт по расходам"
            ["alias"]=>
            string(5) "costs"
          }
          [2]=>
          array(3) {
            ["id"]=>
            int(17)
            ["name"]=>
            string(25) "Годовой отчёт"
            ["alias"]=>
            string(4) "year"
          }
        }
      }
      [1]=>
      array(4) {
        ["id"]=>
        int(14)
        ["name"]=>
        string(20) "Управление"
        ["alias"]=>
        string(7) "control"
        [0]=>
        array(2) {
          [0]=>
          array(3) {
            ["id"]=>
            int(18)
            ["name"]=>
            string(55) "Отчёт по эффективности работы"
            ["alias"]=>
            string(10) "efficiency"
          }
          [1]=>
          array(3) {
            ["id"]=>
            int(19)
            ["name"]=>
            string(40) "Отчёт по подключениям"
            ["alias"]=>
            string(10) "connecting"
          }
        }
      }
    }
  }
}

Нужно из него сделать одномерный массив и присвоить категориям parent_id, пробовал сделать так

<?php

function flatten($arr, $parentId = null) 
{
    $ret = [];
    foreach ($arr as $item) {
        
        if (array_key_exists('childrens', $item))  {
            $item['parent_id'] = $parentId;
            $ret[] = $item;
            $ret = array_merge($ret, flatten($item['childrens'], $item['id']));
        }
        else{
            $item['parent_id'] = $parentId;
            $ret[] = $item;
            $ret = array_merge($ret, flatten($item['id'], $item['id']));
        }
                
    }
    
    return $ret; 
}

Но не понятно какую функцию применить что бы извлечить из массива уровнем выше id


Ответы (1 шт):

Автор решения: ArchDemon

В примере показана только суть ответа. Думаю, подстроите код под свои нужды

function flatten($arr, $parentId = null) 
{
    $ret = [];
    foreach ($arr as $item) {
        $item['parent_id'] = $parentId;
        $ret[] = $item;
        $ret = array_merge($ret, flatten($item['childrens'], $item['id']));     
    }
    return $ret; 
}
→ Ссылка