Объединить родительский дочерний массив - PullRequest
0 голосов
/ 29 января 2019

У меня есть массив PHP.Я пытаюсь преобразовать в массив типа «родитель-потомок»: я использовал рекурсивную функцию, но не получаю свой вывод.

Array
(


    [0] => Array
        (
            [id] => 1
            [subscription_name] => Yearly 
            [parent_id] => 0
        )



    [1] => Array
        (
            [id] => 22
            [subscription_name] => Yearly new               
            [parent_id] => 1
        )

    [2 => Array
        (
            [id] => 23
            [subscription_name] => Yearly new offer 
            [parent_id] => 22
        )

    [3] => Array
        (
            [id] => 24
            [subscription_name] => Weekly
            [parent_id] => 0
        )

    [4] => Array
        (
            [id] => 25
            [subscription_name] => Weekly new offer
            [parent_id] => 24
        )

)

Я ожидаю этот результат

Array
(
    [0] => Array
        (
            [id] => 1
            [subscription_name] => Yearly new offer 
            [childrens] => Array
                (
                    [0] => Array
                        (
                            [id] => 22
                        )
                    [1] => Array
                        (
                            [id] => 23
                        )   
                )

        )

    [1] => Array
        (
            [id] => 24
            [subscription_name] => Weekly new offer 
            [childrens] => Array
                (
                    [0] => Array
                        (
                            [id] => 25
                        )

                )

        )

)

Я пытался, ноне получается мое желание Вывод

Моя PHP-функция

function tree(array $elements, $parent_id = 0) {
      echo "<pre>";
        $branch = array();
        $a=array();
        foreach ($elements as $element) {
           if ($element['parent_id'] == $parent_id && $element['subscription_type_id'] !=1 ) {
                $children = $this->tree($elements, $element['id']);
                if ($children) {
                    $element['children'] = $children;
                }
                else {
                    $element['children'] = array();
                }
                $branch[] = $element;
            }

        }
        return $branch;
    }

Вот вывод, который я получаю из вышеуказанной функции:

Array
(
    [0] => Array
    (
        [id] => 1
        [subscription_name] => Yearly 
        [children] => Array
        (
                [0] => Array
                    (
                        [id] => 22
                        [subscription_name] => Yearly new 
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 23
                                        [subscription_name] => Yearly new offer 
                                        [children] => Array
                                            (
                                            )

                                    )

                        )

                )

    )

)

[1] => Array
(
    [id] => 24
    [subscription_name] => Weekly
    [children] => Array
        (
            [0] => Array
                (
                    [id] => 25
                    [subscription_name] => Weekly new offer 
                    [children] => Array
                        (
                        )

                )

        )

)

Пожалуйста, помогите мне решитьЭта проблема.Спасибо.

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Действительно, я имею в виду ДЕЙСТВИТЕЛЬНО наивную версию, но, между прочим, ваши данные будут действительно более просты в использовании, например, если у вас нет значений от parent_id до 0, если это не родительский идентификатор (например, NULL), я тожене понимаю, почему у вас разные subscription_name.Я думаю, вы должны больше работать над изменением входных данных, а не искать сложный алгоритм для их анализа

function tree(array $elements) {
    $openList = [];
    $result = [];
    $id = 0;
    foreach ($elements as $key => $element) {
        if($key != 0) // I suppose the trial one is not used
        {
            if($element['parent_id'] == 0) // a root
            {
                $closeList = [];
                $openList[$element['id']] = $element['id'];
                $result[$id] = $element;
                unset($result[$id]['parent_id']);
                $result[$id]['children'] = [];
                $newOpenlist = [];
                while(count($openList) > 0)
                {
                    foreach ($elements as $key => $element) {
                        if($element['parent_id'] != 0 && in_array($element['parent_id'], $openList) && !in_array($element['parent_id'], $closeList))
                        {
                            $newOpenlist[$element['id']] = $element['id'];
                            $result[$id]['children'][] = $element;
                        }
                    }
                    foreach($openList as $item)
                    {
                        $closeList[] = $item;
                    }
                    $openList = $newOpenlist;
                    $newOpenlist = [];
                }
            }
            $id++;
        }
    }
    return $result;
}
0 голосов
/ 29 января 2019

Из вашего вопроса я не совсем понимаю логику, стоящую за subscription_name.Относительно кода childrens ниже может работать.

<?php

$array = [
  [
 'id' => 1,
 'subscription_name' => 'Yearly',
 'parent_id' => 0
],
   [
 'id' => 22,
 'subscription_name' => 'Yearly new',
 'parent_id' => 1
],
   [
 'id' => 23,
 'subscription_name' => 'Yearly new offer',
 'parent_id' => 22
],
   [
 'id' => 24,
 'subscription_name' => 'Weekly',
 'parent_id' => 0
],
   [
 'id' => 25,
 'subscription_name' => 'Weekly new offer',
 'parent_id' => 24
],

    ];
function find_childrens_parent_not_zero($array) {  

foreach($array as $key => $value) {

 if($value['parent_id'] != 0) {
    if(!is_array($array[$key]['childrens'])) {
      $array[$key]['childrens'] = [];
    }

    foreach($array as $k => $v) {
      if($v['parent_id'] == $value['id']) {
        array_push($array[$key]['childrens'], array('id' => $v['id']));
        unset($array[$k]['parent_id']);       
      }
    }
 }

}

return $array;
}

function find_childrens_parent_zero($array) {  

  foreach($array as $key => $value) {

   if($value['parent_id'] == 0) {
      if(!is_array($array[$key]['childrens'])) {
        $array[$key]['childrens'] = [];
      }

      foreach($array as $k => $v) {
        if($v['parent_id'] == $value['id']) {
          array_push($array[$key]['childrens'], array('id' => $v['id']));
          unset($array[$k]['parent_id']);       
        }
      }
   }

  }

  return $array;
  }
function merge_children($array) {

    foreach($array as $key => $value) {
      if($value['parent_id'] == 0) { 
        //pluck childrens of it's children
        foreach($value['childrens'] as $k => $v) {
          foreach($array as $ke => $val) {
            if($v['id'] == $val['id']) {              
              $array[$key]['childrens'] = array_merge($array[$key]['childrens'], $array[$ke]['childrens']);

            }
          }
        }
      }
    }
    return $array;
}
/**
 * Remove parent not zero elements
 */
function cleanup_array($array) {
  $result = [];
  foreach($array as $key => $value) {
    if(array_key_exists('parent_id', $value )) {
      unset($value['parent_id']); 
      array_push($result, $value);  

     }
    }
    return $result;
}
echo '<pre>';
$result_parent_not_zero = find_childrens_parent_not_zero($array);
$result_parent_zero     = find_childrens_parent_zero($result_parent_not_zero);
$result_merged_children = merge_children($result_parent_zero);
$result_cleaned_up      = cleanup_array($result_merged_children);
print_r($result_cleaned_up); 

даст вам результат как

<pre>Array
(
    [0] => Array
        (
            [id] => 1
            [subscription_name] => Yearly
            [childrens] => Array
                (
                    [0] => Array
                        (
                            [id] => 22
                        )

                    [1] => Array
                        (
                            [id] => 23
                        )

                )

        )

    [1] => Array
        (
            [id] => 24
            [subscription_name] => Weekly
            [childrens] => Array
                (
                    [0] => Array
                        (
                            [id] => 25
                        )

                )

        )

)
0 голосов
/ 29 января 2019
<?php

$load[0]['id'] = 0;
$load[0]['subscription_name'] = 'Trial';
$load[0]['parent_id'] = 0;

$load[1]['id'] = 1;
$load[1]['subscription_name'] = 'Yearly';
$load[1]['parent_id'] = 0;

$load[2]['id'] = 2;
$load[2]['subscription_name'] = 'Trial';
$load[2]['parent_id'] = 1;

$load[3]['id'] = 3;
$load[3]['subscription_name'] = 'Yearly';
$load[3]['parent_id'] = 1;

$load[4]['id'] = 4;
$load[4]['subscription_name'] = 'Trial';
$load[4]['parent_id'] = 2;

function tree($load){
    $output = [];
    foreach($load as $l){
        $temp = [];
        foreach($load as $ll){
            if($ll['parent_id']==$l['id']){
                if($l['id']==$ll['id'])
                continue;
                $temp[] = $ll; 
            }
        }
        $l['childrens'] = $temp;
        $output[] = $l;
    }
    return $output;    
}

echo "<pre>";
print_r(tree($load));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...