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

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

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

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

 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:我的ECshop二次开发从零开始Nächster Artikel:PHP rtrim函数bug