>백엔드 개발 >PHP 튜토리얼 >php 将一个二维数组转换成有父子关系的数组_PHP教程

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

WBOY
WBOY원래의
2016-07-20 11:14:551743검색

<?<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>?>

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/440239.htmlTechArticle? = __construct( , = ('id', 'pid'), = 0 -result = -fields = -root = - ( -result [ [ -fields[1]]][] = ( ( = ( ); 0; -- ( = (! ( , - (! - -tmp = ( , -already[] = ( = ( [ -fields[0]]...
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.