【问题标题】:Merge Parent child array合并父子数组
【发布时间】:2019-01-29 10:41:36
【问题描述】:

我有 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
                        (
                        )

                )

        )

)

请帮我解决这个问题。 谢谢。

【问题讨论】:

  • 23 的 parent_id 是 22,因此它出现在 22 的数组下。如果你想像上面说的那样输出,你必须把 23 的 parent_id 改成 1。
  • 也不改算法
  • 您确定这是所需的输出吗?查看 id=0 的初始数组,它似乎是 ids (0, 1, 21) 的父数组,但我没有在所需的输出中看到它们。
  • 也许this 可以提供帮助
  • 3v4l.org/obbWl - 检查一下

标签: php arrays codeigniter loops parent-child


【解决方案1】:

真的,我的意思是非常幼稚的版本,但顺便说一句,你的数据真的更容易被利用,比如如果它不是父 ID(例如 NULL),则没有任何 parent_id 到 0 我也这样做不明白为什么你有不同的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;
}

【讨论】:

  • 谢谢,您的回答非常接近我想要的输出。
【解决方案2】:

从您的问题来看,我并不清楚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
                        )

                )

        )

)

【讨论】:

  • 代码很长,但还是比我的更清晰准确
  • @Krishnads PC,订阅名称背后的逻辑是当用户更新订阅名称然后插入新条目并且新行的父 id 是旧的更新 id(唯一 id)。
  • @ShubhamAzad 这就是数据库中发生的事情?从这个数组我们需要做什么?从数据库本身以您想要的方式获取它总是更好。
  • @Krishnads,我知道通过查询获取输出的更好方法,但我不明白如何通过查询获取此输出。然后我获取所有记录并使用 PHP 数组重新排列。
【解决方案3】:
<?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));

【讨论】:

  • 我不认为这是想要的输出
猜你喜欢
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
相关资源
最近更新 更多