好用的php类库和方法

1,

    /**

     * 将一个平面的二维数组按照指定的字段转换为树状结构

     *

     * 用法:

     * @code php

     * $rows = array(

     *     array('id' => 1, 'value' => '1-1', 'parent' => 0),

     *     array('id' => 2, 'value' => '2-1', 'parent' => 0),

     *     array('id' => 3, 'value' => '3-1', 'parent' => 0),

     *

     *     array('id' => 7, 'value' => '2-1-1', 'parent' => 2),

     *     array('id' => 8, 'value' => '2-1-2', 'parent' => 2),

     *     array('id' => 9, 'value' => '3-1-1', 'parent' => 3),

     *     array('id' => 10, 'value' => '3-1-1-1', 'parent' => 9),

     * );

     *

     * $tree = ArrayHelper::tree($rows, 'id', 'parent', 'nodes');

     *

     * dump($tree);

     *   // 输出结果为:

     *   // array(

     *   //   array('id' => 1, ..., 'nodes' => array()),

     *   //   array('id' => 2, ..., 'nodes' => array(

     *   //        array(..., 'parent' => 2, 'nodes' => array()),

     *   //        array(..., 'parent' => 2, 'nodes' => array()),

     *   //   ),

     *   //   array('id' => 3, ..., 'nodes' => array(

     *   //        array('id' => 9, ..., 'parent' => 3, 'nodes' => array(

     *   //             array(..., , 'parent' => 9, 'nodes' => array(),

     *   //        ),

     *   //   ),

     *   // )

     * @endcode

     *

     * 如果要获得任意节点为根的子树,可以使用 $refs 参数:

     * @code php

     * $refs = null;

     * $tree = ArrayHelper::tree($rows, 'id', 'parent', 'nodes', $refs);

     *

     * // 输出 id 为 3 的节点及其所有子节点

     * $id = 3;

     * dump($refs[$id]);

     * @endcode

     *

     * @param array $arr 数据源

     * @param string $keyNodeId 节点ID字段名

     * @param string $keyParentId 节点父ID字段名

     * @param string $keyChildrens 保存子节点的字段名

     * @param boolean $refs 是否在返回结果中包含节点引用

     *

     * return array 树形结构的数组

     */

    static function toTree($arr, $keyNodeId, $keyParentId = 'parent_id', $keyChildrens = 'childrens', & $refs = NULL)

    {

        $refs = array();

        foreach ($arr as $offset => $row)

        {

            $arr[$offset][$keyChildrens] = array();

            $refs[$row[$keyNodeId]] =& $arr[$offset];

        }

    

        $tree = array();

        foreach ($arr as $offset => $row)

        {

            $parentId = $row[$keyParentId];

            if ($parentId)

            {

                if (!isset($refs[$parentId]))

                {

                    $tree[] =& $arr[$offset];

                    continue;

                }

                $parent =& $refs[$parentId];

                $parent[$keyChildrens][] =& $arr[$offset];

            }

            else

            {

                $tree[] =& $arr[$offset];

            }

        }

        return $tree;

    }

    

    /**

     * 将树形数组展开为平面的数组

     *

     * 这个方法是 tree() 方法的逆向操作。

     *

     * @param array $tree 树形数组

     * @param string $keyChildrens 包含子节点的键名

     *

     * @return array 展开后的数组

     */

    static function treeToArray($tree, $keyChildrens = 'childrens')

    {

        $ret = array();

        if (isset($tree[$keyChildrens]) && is_array($tree[$keyChildrens]))

        {

            foreach ($tree[$keyChildrens] as $child)

            {

                $ret = array_merge($ret, self::treeToArray($child, $keyChildrens));

            }

            unset($node[$keyChildrens]);

            $ret[] = $tree;

        }

        else

        {

            $ret[] = $tree;

        }

        return $ret;

    }

 

你可能感兴趣的:(PHP)