PHP分层阵列 - 家长和孩子的(PHP hierarchical array - Parents

2019-07-05 07:39发布

我使用PHP和MySQL与Idiorm 。 这可能是不相关的。

我的PHP数组

  • 这是父母与孩子的之间的关系。
  • 0是根母体。
  • 例如:根母体0有子33具有子具有子71 27。

如果需要解决的问题。此阵列结构是可以改变的。

array (
  33 => 
    array (
      0 => '27',
      1 => '41',
  ),
  27 => 
    array (
      0 => '64',
      1 => '71',
  ),
  0 => 
    array (
      0 => '28',
      1 => '29',
      2 => '33',
  ),
)

我的分级结果

事情是这样的,但作为一个数组...

  0 => 
      28
      29
      33
         27 =>
               64
               71
         41

信息

  • 深度是未知的,它可以是无限的。 我想的foreach,但它可能不会是这样。

我自己的想法

  • 有些递归函数?
  • 有些while循环?

我想这两个以上的,刚拿到一个烂摊子。 这是一个显而易见的。

Answer 1:

通过@deceze的建议的工作。 然而输入数组需要改变豆蔻,像这样...

$rows = array(
    array(
        'id' => 33,
        'parent_id' => 0,
    ),
    array(
        'id' => 34,
        'parent_id' => 0,
    ),
    array(
        'id' => 27,
        'parent_id' => 33,
    ),
    array(
        'id' => 17,
        'parent_id' => 27,
    ),
);

从https://stackoverflow.com/a/8587437/476 :

function buildTree(array $elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

$tree = buildTree($rows);

print_r( $tree );


Answer 2:

我加入@JensTörnell的回答,使定义PARENT_ID,孩子数组键名,也为ID列名的列名的选项。

/**
 * function buildTree
 * @param array $elements
 * @param array $options['parent_id_column_name', 'children_key_name', 'id_column_name'] 
 * @param int $parentId
 * @return array
 */
function buildTree(array $elements, $options = [
    'parent_id_column_name' => 'parent_id',
    'children_key_name' => 'children',
    'id_column_name' => 'id'], $parentId = 0)
    {
    $branch = array();
    foreach ($elements as $element) {
        if ($element[$options['parent_id_column_name']] == $parentId) {
            $children = buildTree($elements, $options, $element[$options['id_column_name']]);
            if ($children) {
                $element[$options['children_key_name']] = $children;
            }
            $branch[] = $element;
        }
    }
    return $branch;
}

由于该功能是相当普遍的 ,我设法使用我的大多数项目的上述功能。



Answer 3:

从@JensTörnell伟大的答案,只是想补充一点改善,如果你的PARENT_ID和id实际上是字符串,而不是数量,然后上面的方法将失败,并创建子阵列后,它将再次创建这些儿童阵列作为单独的个体阵列。 为了解决这个问题,你应该做的三重平等检查,并通过对比告诉变量,即(串)的数据类型。

在基于阵列的字符串ID和PARENT_ID

function buildTree(array $elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ((string)$element['parent_id']  === (string)$parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

此外,如果一个人的欲望,他可以添加第三个参数的功能,以及指定变量数据类型动态,即function buildTree(array $elements, $parentId = 0, $datatype='string')但是你将不得不采取的任何其他错误发生。

希望这会帮助别人!



Answer 4:

public function createTree (&$list, $parentId = null) {
    $tree = array();
    foreach ($list as $key => $eachNode) {
        if ($eachNode['parentId'] == $parentId) {
            $eachNode['children'] = $this->createTree ($list,$eachNode['id']);
            $tree[] = $eachNode;
            unset($list[$key]);
        }
    }
    return $tree;
}

在该函数中通过关联数组,并且如果最父不为空则只是通过最父id作为第二个参数。



文章来源: PHP hierarchical array - Parents and childs