преобразование многомерного массива

Статус
В этой теме нельзя размещать новые ответы.

yintar

Новичок
Всем привет!!!!
Есть массив неограниченной вложенноси такого вида :

Array
(
[0] => Array
(
[text] => Краснова Светлана
[parent_id] => 270
[count] => 2
[line] => 1
[expanded] =>
[children] => Array
(
[0] => Array
(
[text] => Колесник Александр Анатольевич
[parent_id] => 297
[count] => 0
[line] => 2
[expanded] =>
[children] =>
)​

[1] => Array
(
[text] => Савлов Константин
[parent_id] => 297
[count] => 2
[line] => 2
[expanded] =>
[children] => Array
(
[0] => Array
(
[text] => Смолина Светлана Александровна
[parent_id] => 337
[count] => 0
[line] => 3
[expanded] =>
[children] =>
)
[1] => Array
(
[text] => Власова Надежда Ивановна
[parent_id] => 337
[count] => 0
[line] => 3
[expanded] =>
[children] =>
)​

)​

)​

)​

)​

[1] => Array
(
[text] => Варич Юрий
[parent_id] => 270
[count] => 0
[line] => 1
[expanded] =>
[children] =>
)​

[2] => Array
(
[text] => Данилова Наталья
[parent_id] => 270
[count] => 0
[line] => 1
[expanded] =>
[children] =>
)​

)

А мне этот массив надо преобразовать в такой :

Array (
[0] => Array
(
[text] => Краснова Светлана
[parent_id] => 270
[count] => 2
[line] => 1
[expanded] =>
[children] => Array
(​
[1] => Array
(
[text] => Колесник Александр Анатольевич
[parent_id] => 297
[count] => 0
[line] => 2
[expanded] =>
[children] =>
)​

[2] => Array
(
[text] => Савлов Константин
[parent_id] => 297
[count] => 2
[line] => 2
[expanded] =>
[children] => Array
(​
[3] => Array
(
[text] => Смолина Светлана Александровна
[parent_id] => 337
[count] => 0
[line] => 3
[expanded] =>
[children] =>
)​

[1] => Array
(
[text] => Власова Надежда Ивановна
[parent_id] => 337
[count] => 0
[line] => 3
[expanded] =>
[children] =>
)​

[4] => Array
(
[text] => Варич Юрий
[parent_id] => 270
[count] => 0
[line] => 1
[expanded] =>
[children] =>
)​

[5] => Array
(
[text] => Данилова Наталья
[parent_id] => 270
[count] => 0
[line] => 1
[expanded] =>
[children] =>
)​

)

Пробовал с помощью рекурсии,но желаемого результата не достиг
Подскажите,пожалуйста алгоритм такого преобразования.

Вот мой код ,но массив нужного вида не получается.Я пробовал по-разному.Мучаюсь с этой проблемой уже неделю но именно такой массив как мне надо не получается.Подскажите пожалуйста где я ошибаюсь
Код:
 public function getLineAndCountUsers($my_data) {
        $data = array();
        $i=0;
     
      if ($my_data[$i]['children'] != '') {
        foreach ($my_data[$i]['children'] as $value){
            if($value['children'] == ''){
                $my_data[]=$value;
            } else {
                $my_data[] = $this->getLineAndCountUsers( $value['children']);
            }
          }
      } else {
            $offset=$i;
            $my_data[] = $my_data[$i]['children'][$i];
        }
}
 

vasinsky

Новичок
рекурсия тут к месту, но
$data = array(); - ты каждый раз сбрасываешь массив

попробуй так

PHP:
function getArray($array){
    $res = array();
    static $res;

    foreach($array as $k=>$v){
      if(!is_array($v['children'])){
            $res[] = $v;
      }
      else{
            getArray($v['children']); 
      }
    }

    return $res;
}

хотя в твоём случае - можно в свойство класса всё писать в $this->data
 

Crys

Двинутый новичок
PHP:
    public function getLineAndCountUsers($data) {
        $result = array();
        foreach ($data as $item) {
          if ($item['children'] !== '') {
                $result+=$this->getLineAndCountUsers($item['children']);
          }
          $item['children'] = '';// если не нужно сохранять детей
          $result[] = $item;
        }
        return $result;
    }
 

yintar

Новичок
PHP:
    public function getLineAndCountUsers($data) {
        $result = array();
        foreach ($data as $item) {
          if ($item['children'] !== '') {
                $result+=$this->getLineAndCountUsers($item['children']);
          }
          $item['children'] = '';// если не нужно сохранять детей
          $result[] = $item;
        }
        return $result;
    }

Ругается на Invalid argument supplied for foreach()
 

German Malinovsky

Новичок
PHP:
function traverse($rootNodes, &$array)
{
    foreach($rootNodes as $node)
    {
        array_push($array, $node);
        if(isset($node['children']) and count($node['children']) > 0){
            traverse($node['children'], $array);
        }
    }
}

$result = [];

$nodes = array(твой массив);
traverse($nodes, $result);
В результитрующем массиве result будет плоский массив с сохранением children ключа, который при необходимости можешь отбросить
 
Последнее редактирование:

yintar

Новичок
рекурсия тут к месту, но
$data = array(); - ты каждый раз сбрасываешь массив

попробуй так

PHP:
function getArray($array){
    $res = array();
    static $res;

    foreach($array as $k=>$v){
      if(!is_array($v['children'])){
            $res[] = $v;
      }
      else{
            getArray($v['children']);
      }
    }

    return $res;
}

хотя в твоём случае - можно в свойство класса всё писать в $this->data
Спасибо за ответ но получается так же как и у меня набор разрозненных массивов с потерей некоторых
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху