Home >php教程 >php手册 >php 将一个二维数组转换成有父子关系的数组

php 将一个二维数组转换成有父子关系的数组

WBOY
WBOYOriginal
2016-06-13 11:30:381004browse

<?<span php
</span><span /*</span><span *
 * Tree 树型类(无限分类)
 *
 * @author Kvoid
 * @copyright http://kvoid.com
 * @version 1.0
 * @access public
 * @example
 *   $tree= new Tree($result);
 *   $arr=$tree->leaf(0);
 *   $nav=$tree->navi(15);
 </span><span */</span>
<span class</span><span  Tree {
    </span><span private</span> <span $result</span><span ;
    </span><span private</span> <span $tmp</span><span ;
    </span><span private</span> <span $arr</span><span ;
    </span><span private</span> <span $already</span> = <span array</span><span ();
    </span><span /*</span><span *
     * 构造函数
     *
     * @param array $result 树型数据表结果集
     * @param array $fields 树型数据表字段,array(分类id,父id)
     * @param integer $root 顶级分类的父id
     </span><span */</span>
    <span public</span> <span function</span> __construct(<span $result</span>, <span $fields</span> = <span array</span>('id', 'pid'), <span $root</span> = 0<span ) {
        </span><span $this</span>->result = <span $result</span><span ;
        </span><span $this</span>->fields = <span $fields</span><span ;
        </span><span $this</span>->root = <span $root</span><span ;
        </span><span $this</span>-><span handler();
    }
    </span><span /*</span><span *
     * 树型数据表结果集处理
     </span><span */</span>
    <span private</span> <span function</span><span  handler() {
        </span><span foreach</span> (<span $this</span>->result <span as</span> <span $node</span><span ) {
            </span><span $tmp</span>[<span $node</span>[<span $this</span>->fields[1]]][] = <span $node</span><span ;
        }
        </span><span krsort</span>(<span $tmp</span><span );
        </span><span for</span> (<span $i</span> = <span count</span>(<span $tmp</span>); <span $i</span> > 0; <span $i</span>--<span ) {
            </span><span foreach</span> (<span $tmp</span> <span as</span> <span $k</span> => <span $v</span><span ) {
                </span><span if</span> (!<span in_array</span>(<span $k</span>, <span $this</span>-><span already)) {
                    </span><span if</span> (!<span $this</span>-><span tmp) {
                        </span><span $this</span>->tmp = <span array</span>(<span $k</span>, <span $v</span><span );
                        </span><span $this</span>->already[] = <span $k</span><span ;
                        </span><span continue</span><span ;
                    } </span><span else</span><span  {
                        </span><span foreach</span> (<span $v</span> <span as</span> <span $key</span> => <span $value</span><span ) {
                            </span><span if</span> (<span $value</span>[<span $this</span>->fields[0]] == <span $this</span>->tmp[0<span ]) {
                                </span><span $tmp</span>[<span $k</span>][<span $key</span>]['child'] = <span $this</span>->tmp[1<span ];
                                </span><span $this</span>->tmp = <span array</span>(<span $k</span>, <span $tmp</span>[<span $k</span><span ]);
                            }
                        }
                    }
                }
            }
            </span><span $this</span>->tmp = <span null</span><span ;
        }
        </span><span $this</span>->tmp = <span $tmp</span><span ;
    }
    </span><span /*</span><span *
     * 反向递归
     </span><span */</span>
    <span private</span> <span function</span> recur_n(<span $arr</span>, <span $id</span><span ) {
        </span><span foreach</span> (<span $arr</span> <span as</span> <span $v</span><span ) {
            </span><span if</span> (<span $v</span>[<span $this</span>->fields[0]] == <span $id</span><span ) {
                </span><span $this</span>->arr[] = <span $v</span><span ;
                </span><span if</span> (<span $v</span>[<span $this</span>->fields[1]] != <span $this</span>->root) <span $this</span>->recur_n(<span $arr</span>, <span $v</span>[<span $this</span>->fields[1<span ]]);
            }
        }
    }
    </span><span /*</span><span *
     * 正向递归
     </span><span */</span>
    <span private</span> <span function</span> recur_p(<span $arr</span><span ) {
        </span><span foreach</span> (<span $arr</span> <span as</span> <span $v</span><span ) {
            </span><span $this</span>->arr[] = <span $v</span>[<span $this</span>->fields[0<span ]];
            </span><span if</span> (<span $v</span>['child']) <span $this</span>->recur_p(<span $v</span>['child'<span ]);
        }
    }
    </span><span /*</span><span *
     * 菜单 多维数组
     *
     * @param integer $id 分类id
     * @return array 返回分支,默认返回整个树
     </span><span */</span>
    <span public</span> <span function</span> leaf(<span $id</span> = <span null</span><span ) {
        </span><span $id</span> = (<span $id</span> == <span null</span>) ? <span $this</span>->root : <span $id</span><span ;
        </span><span return</span> <span $this</span>->tmp[<span $id</span><span ];
    }
    </span><span /*</span><span *
     * 导航 一维数组
     *
     * @param integer $id 分类id
     * @return array 返回单线分类直到顶级分类
     </span><span */</span>
    <span public</span> <span function</span> navi(<span $id</span><span ) {
        </span><span $this</span>->arr = <span null</span><span ;
        </span><span $this</span>->recur_n(<span $this</span>->result, <span $id</span><span );
        </span><span krsort</span>(<span $this</span>-><span arr);
        </span><span return</span> <span $this</span>-><span arr;
    }
    </span><span /*</span><span *
     * 散落 一维数组
     *
     * @param integer $id 分类id
     * @return array 返回leaf下所有分类id
     </span><span */</span>
    <span public</span> <span function</span> leafid(<span $id</span><span ) {
        </span><span $this</span>->arr = <span null</span><span ;
        </span><span $this</span>->arr[] = <span $id</span><span ;
        </span><span $this</span>->recur_p(<span $this</span>->leaf(<span $id</span><span ));
        </span><span return</span> <span $this</span>-><span arr;
    }
}
</span>?>

 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn