PHP無限階層データ実装プログラムコード_PHPチュートリアル

WBOY
リリース: 2016-07-13 16:56:50
オリジナル
1124 人が閲覧しました

PHP での無制限の分類の使用法をいくつか紹介します。これには、必要な友達が参照できる、直接の無制限の分類データベースと配列の操作が含まれます。

まず、php データベースと mysql データベースの無制限の分類を見てみましょう


データベースの作成:
id、fid、fname (id と fid は両方とも数値型でなければならず、fid のデフォルト値は 0 に設定する必要があります;

コードは次のとおりです コードをコピー

$stime=microtime();

$db=@mysql_connect("localhost","root","micronsky.net") または die("データベース接続が失われました");
mysql_select_db("temp",$db);
//最初のレベルの分類を定義します
関数 mainfl()
{
グローバル $db;
$result=mysql_query("select id,fid,fname from wxjfl where fid=0 order by id desc",$db);
if ($myrow=mysql_fetch_array($result)) {
やります{
echo $myrow["fname"];
echo "
";
echo subfl($myrow["id"]," ") //ここでサブレベル分類関数が呼び出されます
}
while ($myrow=mysql_fetch_array($result));
}

}
// サブカテゴリを定義します
関数 subfl($fid,$strdis)
{
グローバル $db;
$result1=mysql_query("select id,fid,fname from wxjfl where fid=$fid order by id desc",$db);
if ($myrow1=mysql_fetch_array($result1)) {
やります{
// エコー $strdis;
echo $strdis.$myrow1["fname"];
echo "
";
Subfl($myrow1["id"]," ".$strdis); //上記の関数のようにエコーする必要がないことに注意してください...サブレベルの分類関数を直接呼び出して、価値!同時に、これは再帰的な部分でもあります
}
while ($myrow1=mysql_fetch_array($result1));
}
}


echo mainfl();

$ltime=microtime();
echo "
";
echo number_format($ltime-$stime,4); //統計的な実行時間。これは ASP よりもはるかに高速ですが、これは書き込み方法とはほとんど関係ありません。これは主に PHP 自体にアクセラレータが追加されているためです。

?>


ページングに配列を直接使用するようになりました

コードは次のとおりです コードをコピー

/**
* 親ノードのツリー配列を作成します
*パラメータ
* $ar 配列、隣接リストに整理されたデータ
* $id は配列内の主キーとして添え字または関連するキー名です
* $pid は配列内の親キーとして添え字または関連付けられたキー名です
* 多次元配列を返します
**/
関数 find_parent($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
If( $item[$pid] ){
If( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) )
$t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];

$t[$k]['reference'] = true;
}
}
$t;
を返します }


/**
* 子ノードのツリー配列を作成します
*パラメータ
* $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];

$t[$k]['reference'] = true;
}
}
$t;
を返します }

例:

上記の 2 つの方法は、ID によってすべてのノードを配列にフラット化し、その親または子を見つけて、そのフラットな要素を参照によって親と子にアタッチすることです。
コードは次のとおりです コードをコピー
$data = array(
array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),
array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父親'),
array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔父'),
array('ID'=>4, 'PARENT'=>2, 'NAME'=>'self'),
array('ID'=>5, 'PARENT'=>4, 'NAME'=>'son')
); $p = find_parent($data, 'ID', 'PARENT'); $c = find_child($data, 'ID', 'PARENT');

ただし、参照される要素は依然としてフラット配列に存在するため、実際のアプリケーションでは、それらの参照される要素をルートとして走査を開始して重複が生じることを避けるために、それらの参照される要素にマークを付けることが最善です。

コードは次のとおりですコードをコピー foreach ($p as $key => $item) {
if($item['reference']) continue;

print_r($item);
}

foreach ($c as $key => $item) {
if($item['reference']) continue;

print_r($item);

}


再帰的メソッドでは、PHP 配列要素が削除された後、配列カーソルはゼロに戻ります。そのため、走査プロセス中に「ホーム」を見つけた一部の要素は配列内に留まる必要があり、後続の要素の検索範囲を変更することはできません。削減されました:

コードは次のとおりです コードをコピー


$mylist = array(array( 'parent_id'=>0,'id'=>1),
array('parent_id'=>0,'id'=>2),
を通じてスルー ‐ ‐ ‐ ‐ ‐ ft t スルーアウトスルーアウトスルーアウトスルーアウトスルーアウトスルーアウトスルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルースルー array('parent_id'=>2,'id'=>4),
array('parent_id'=>2,'id'=>5),
array('parent_id'=>3,'id'=>6),
アウトウェイ’ s ’ ’ ウェイ ’ ウェイ ‐ ‐ ‐ ‐ ‐ ‐ ‐ を通じて ' ' は一緒にアウト、一緒にアウト、' は一緒にアウト array('parent_id'=>4,'id'=>8),
array('parent_id'=>5,'id'=>9),
array('parent_id'=>5,'id'=>10)
);

function _findChildren($list, $p_id){ //データ階層、

$r = array();

foreach($list as $id=>$ite​​m){
If($item['parent_id'] == $p_id) {
$length = count($r);
$r[$length] = $item;
If($t = $this->_findChildren($list, $item['id']) ){
$r[$length]['children'] = $t;
                                                                                             }
}
return $r;
}


print_r(_findChildren($mylist, 0));

http://www.bkjia.com/PHPjc/631571.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/631571.html技術記事 PHP での無制限の分類データベースの直接使用や配列操作など、必要な友人が参照できるようにするためのいくつかの使用法を紹介します。 まずは見てみましょう...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!