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

142
18 июня 2022, 23:40

есть массив:

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

Answer 1

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

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; 
}
READ ALSO
Валидация данных в форме

Валидация данных в форме

Создать форму для ввода электронного адреса в формате vasyapupkin@ukr

143
Проблема с WP_Query

Проблема с WP_Query

Скажите пожалуйста, в чем тут ошибка, мне нужна проверка по 2 полях для цены, но в таком варианте как на скрине не работает, страница не загружается,...

162
как сделать один ajax обработчик на несколько форм

как сделать один ajax обработчик на несколько форм

Хочу что бы отправляло текущую форму по клику на кнопку, в формах одинаковый классform и кнопки

384
Заход на сайт с сохраненным аккаунтом

Заход на сайт с сохраненным аккаунтом

Прочитал https://htmlwebru/php/example/avtorizacija2

469