ホームページ > php教程 > php手册 > php 将一个二维数组转换成有父子关系的数组

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

WBOY
リリース: 2016-06-13 11:30:38
オリジナル
1011 人が閲覧しました

<?<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>?>
ログイン後にコピー

 

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート