2016-02-21 2 views
-1

Я ищу для преобразования многомерного массива в другой многомерный массив с использованием рекурсивной функции.Копирование многомерного массива узлов в другой массив

Источник массив:

Array 
(
    [1] => Array 
     (
      [id] => 1 
      [source_name] => kk56ca1d0f2378f 
      [company_id] => 1 
      [lft] => 1 
      [rgt] => 18 
      [parent_id] => 0 
      [children] => Array 
       (
        [2] => Array 
         (
          [id] => 2 
          [source_name] => kk56ca1d17f3f63 
          [company_id] => 1 
          [lft] => 2 
          [rgt] => 3 
          [parent_id] => 1 
          [children] => Array 
           (
           ) 

         ) 

        [3] => Array 
         (
          [id] => 3 
          [source_name] => kk56ca1d1ebe975 
          [company_id] => 1 
          [lft] => 4 
          [rgt] => 13 
          [parent_id] => 1 
          [children] => Array 
           (
            [6] => Array 
             (
              [id] => 6 
              [source_name] => kk56ca1fc882ac0 
              [company_id] => 1 
              [lft] => 5 
              [rgt] => 10 
              [parent_id] => 3 
              [children] => Array 
               (

               ) 

             ) 

           ) 

         ) 

       ) 

     ) 

) 

, который мне нужно попасть в формат

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [text] => kk56ca1d0f2378f 
      [parent_id] => 0 
      [nodes] => Array 
       (
        [0] => Array 
         (
          [id] => 2 
          [text] => kk56ca1d17f3f63 
          [parent_id] => 1 
          [nodes] => Array 
           (
           ) 

         ) 

        [1] => Array 
         (
          [id] => 3 
          [text] => kk56ca1d1ebe975 
          [parent_id] => 1 
          [nodes] => Array 
           (
            [0] => Array 
             (
              [id] => 6 
              [text] => kk56ca1fc882ac0 
              [parent_id] => 3 
              [nodes] => Array 
               (

               ) 

             ) 

            [1] => Array 
             (
              [id] => 15 
              [text] => kk 
              [parent_id] => 3 
              [nodes] => Array 
               (
               ) 

             ) 

           ) 

         ) 

       ) 

     ) 

) 

Я пытался в течение нескольких часов и не получать нигде с этим. Любая помощь могла бы быть полезна.

Исходный массив имеет ассоциативные индексы (хотя они являются числами), а целевой массив имеет числовые индексы. Кроме того, нужно просто удалить несколько индексов и изменить имена нескольких.

EDIT:

Специфические изменения:

  • изменить имя индекса source_name к тексту
  • имя индекса изменения детей к узлам
  • переменные не установлены индексы LFt, РТГ, company_id

У меня нет большого опыта в рекурсии, поэтому я стараюсь бесплодно.

Это то, что я мог придумать:

// pass array of nodes 
function convert_array($from){ 

    // this is a node 
    if(isset($from['source_name'])) 
    { 
     $temp = array(); 
     $temp['id'] = $from['id']; 

     convert_array($from['children']); 
    } 
    // this is an array of nodes 
    else 
    { 
     foreach($from as $arr) 
     { 
      $ret = convert_array($arr); 
      print_r($ret); 
     } 

    } 
} 

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

+0

Можете ли вы объяснить, что вы хотите изменить в первом массиве? Или вы просто хотите перенумеровать индексы на верхнем уровне массива? – Philip

+0

Можете ли вы уменьшить свой пример, его трудно увидеть, чего вы хотите достичь, оба массива имеют большую разницу во многих аспектах ... –

+0

Массивы - это не наука о ракетах. Поскольку два комментария выше меня уже сказали: «Выясните, что именно вы хотите сделать. А затем просто сделайте это;) ['foreach()'] (https://php.net/foreach) отлично подходит для массивов в PHP. И если у вас есть неизвестные измерения, найдите рекурсию. Тогда должно быть столько простых строк кода – kero

ответ

1

Здесь работает функция:

function convert_array($array) 
{ 
    $retval = array(); 

    foreach($array as $row) 
    { 
     $child    = array(); 
     $child['id']  = $row['id']; 
     $child['text']  = $row['source_name']; 
     $child['parent_id'] = $row['parent_id']; 
     if(count($row['children'])) 
     { $child['nodes'] = convert_array($row['children']); } 
     else 
     { $child['nodes'] = array(); } 
     $retval[] = $child; 
    } 
    return $retval; 
} 

3v4l demo

Я думаю, что это само за себя, КСТАТИ: мы инициализировать пустой массив ($retval), то мы выполняем foreach цикл через весь аргумент массива: для каждого элемента мы инициализируем новый массив и добавляем его id, source_name как text и parent_id; если индекс children имеет элементы, мы выполняем рекурсивный вызов для заполнения индекса массива nodes, иначе мы устанавливаем его в пустой массив.