ホームページ  >  記事  >  バックエンド開発  >  xuzuning モデレーターが投稿した非再帰ツリー配列コンストラクターに関する問題について

xuzuning モデレーターが投稿した非再帰ツリー配列コンストラクターに関する問題について

WBOY
WBOYオリジナル
2016-06-13 13:31:38707ブラウズ

xuzuning モデレーター
によって投稿された非再帰ツリー配列コンストラクターの問題に関して、私は以前にループまたは再帰を使用してツリー配列を構築したことがあります。今日検索していたら、xuzuning モデレーターが投稿した非再帰ツリー配列構築関数を見つけました。


PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
/**
 * 创建子节点树形数组
 * 参数
 * $ar 数组,邻接列表方式组织的数据
 * $id 数组中作为主键的下标或关联键名
 * $pid 数组中作为父键的下标或关联键名
 * 返回 多维数组
 **/
function find_child($ar, $id='id', $pid='pid') {
  foreach($ar as $v) $t[$v[$id]] = $v;
  foreach ($t as $k => $item){
    if( $item[$pid] ) {
      $t[$item[$pid]]['child'][$item[$id]] =& $t[$k];
    }
  }
  return $t;
}



これは非常に巧妙に書かれており、非常に効率的で、非常に安全であると思います。そして、私は多くの恩恵を受けました。しかし、実際に使ってみるとちょっとした問題が発生しました。
この関数の中心的な考え方は、$tree[$pid] などの構造体を通じて保存することです。つまり、各レコードのキーはその $pid です。

json_encode() を使用すると、
{"pid1":{"id":"0001","pid":"0000", "children": となります。 [{"pid2":{"id":"0002","pid":"0001"}},{"pid3":{"id":"0003","pid":"0001" }}]} }このように
しかし、必要な構造は
{"id":"0001","pid":"0000","children":[{"id":"0002"," pid": "0001"},{"id":"0002","pid":"0001"}]}
つまり、レコードを格納するキーが配列のデフォルトになります。

この関数はどのように変更する必要がありますか?

-----解決策---------
新しいアルゴリズムを見つけない限り、不可能です
このアルゴリズムは、pid と id の関係を利用し、連想配列を構築することによって実現されます

この関数を使用したい場合は、この結果を受け入れる必要があります。子キーを削除することも可能です

結果を反復処理する場合は、array_valuesを使用してすべての子配下の連想配列を添字配列に変換する方法もあります
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。