Heim >Backend-Entwicklung >PHP-Tutorial >Best Practices für die unendliche PHP-Klassifizierung

Best Practices für die unendliche PHP-Klassifizierung

高洛峰
高洛峰Original
2017-02-09 09:24:551085Durchsuche

Unbegrenzte Klassifizierung

  • ist eine sehr häufige und notwendige Funktion, fast jedes Projekt verfügt über sie.

  • Anwendungsszenarien: Dropdown-Listen, Baumlisten usw.

Unbegrenzte Klassifizierungstypen

  • Front-End-Implementierung (Das Front-End-Framework wurde im Allgemeinen implementiert und kann generiert werden, solange das Back-End Daten im angegebenen Format an das Front-End überträgt)

  • Back-End-Implementierung(Im Folgenden geht es hauptsächlich um diese Art der Implementierung)

Unendlich mehrere Implementierungen

  • Der erste Typ (empfohlen)

function infiniteSort($data, $showFName, $titleFName, $pidFName = 'pid', $idFName = 'id', $levelFName = 'level', $pid = 0, $level = 0)
{
    $tree = array();

    foreach ($data as $key => $value) {

        if ($value[$pidFName] == $pid) {
            $value[$levelFName] = $level;
            $value[$showFName] = str_repeat('  ', $level) . '|-' . $value[$titleFName];
            $tree[] = $value;
            unset($data[$key]);
            $tempArr = infiniteSort($data, $showFName, $titleFName, $pidFName, $idFName, $level, $value[$idFName], $level + 1);
            if(!empty($tempArr)){
                $tree = array_merge($tree, $tempArr);
            }
        }

    }

    return $tree;
}

Hinweis:
1. $data Alle Daten, die vorhanden sind sortiert nach aufsteigend
2. $showFName Der Feldname des Anzeigenamens (formatiert)
3. $titleFName Der Feldname des Titels (unformatiert)
4. $levelFName Ebenenfeldname
5. $pidFName Feldname der übergeordneten ID
6. $idFName Feldname der ID

  • Der zweite Typ (unter Verwendung von Referenzvariablen)

/**
 * 无限级分类
 * @param Array $treeList //接受处理完成数据的数组
 * @param Array $data //数据库里获取的结果集
 * @param String $level //格式化层级字段名
 * @param Int $pid
 * @param Int $count //第几级分类
 */
function tree(&$treeList, &$data, $level, $show_name, $field_name, $field_pid = 'pid', $field_id = 'id', $pid = 0, $count = 0)
{
    foreach ($data as $key => $value) {

        if ($value[$field_pid] == $pid) {
            $value[$level] = $count;
            $value[$show_name] = str_repeat('    ',$count).'|-'.$value[$field_name];
            $treeList[] = $value;
            unset($data[$key]);
            tree($treeList, $data, $level, $show_name, $field_name,$field_pid, $field_id, $value[$field_id], $count+1);
        }

    }
}

Hinweis:
1 . $data Alle Daten, die nach ASC sortiert wurden
2. Die zurückgegebenen Listendaten auf unendlicher Ebene werden in $treeList

  • gespeichert dritter Typ (Es gibt Einschränkungen bei der Verwendung statischer Variablen: Wenn eine Anfrage zweimal aufgerufen wird. Wenn Sie 2 unendliche Klassifizierungsebenen implementieren möchten, treten Probleme auf, daher wird dies nicht empfohlen)

    public function getTree($list, $parent_id, $level=0) {
        //应该是静态的局部变量,这样才能保证,在递归调用时,所有
        //的getTree方法,操作的是一个Tree空间。
        static $tree = array();//保存找到的分类的数组
        //遍历所有分类,通过parent_id判断,哪些是我们正在查找的
        foreach($list as $row) {
            //判断当前所遍历的分类$row, 是否是当前需要查找的子分类
            if($row['pid'] == $parent_id) {
                //找到了一个分类
                //存起来,存哪?
                $row['level'] = $level;
                $tree[] = $row;
                //继续查找当前$row所代表的分类的子分类
                $this->getTree($list, $row['id'], $level+1);
            }
        }
        return $tree;
    }

Hinweis:
1. $list Alle Daten, die nach aufsteigend sortiert wurden

Unbegrenzte Klassifizierung

  • ist eine sehr häufige und notwendige Funktion, fast jedes Projekt hat sie.

  • Anwendungsszenarien: Dropdown-Listen, Baumlisten usw.

Unbegrenzte Klassifizierungstypen

  • Front-End-Implementierung (Das Front-End-Framework wurde im Allgemeinen implementiert und kann generiert werden, solange das Back-End Daten im angegebenen Format an das Front-End überträgt)

  • Back-End-Implementierung(Im Folgenden geht es hauptsächlich um diese Art der Implementierung)

Unendlich mehrere Implementierungen

  • Der erste Typ (empfohlen)

function infiniteSort($data, $showFName, $titleFName, $pidFName = 'pid', $idFName = 'id', $levelFName = 'level', $pid = 0, $level = 0)
{
    $tree = array();

    foreach ($data as $key => $value) {

        if ($value[$pidFName] == $pid) {
            $value[$levelFName] = $level;
            $value[$showFName] = str_repeat('  ', $level) . '|-' . $value[$titleFName];
            $tree[] = $value;
            unset($data[$key]);
            $tempArr = infiniteSort($data, $showFName, $titleFName, $pidFName, $idFName, $level, $value[$idFName], $level + 1);
            if(!empty($tempArr)){
                $tree = array_merge($tree, $tempArr);
            }
        }

    }

    return $tree;
}

Hinweis:
1 $data Alle Daten, die nach aufsteigend sortiert wurden
2 , $showFName Zeigt den Feldnamen des Namens an (formatiert)
3. $titleFName Der Feldname von der Titel (unformatiert)
4. $levelFName Ebenenfeldname
5. $pidFName Feldname der übergeordneten ID
6 🎜>Feldname der ID

  • Zweiter Typ (unter Verwendung von Referenzvariablen)

/**
 * 无限级分类
 * @param Array $treeList //接受处理完成数据的数组
 * @param Array $data //数据库里获取的结果集
 * @param String $level //格式化层级字段名
 * @param Int $pid
 * @param Int $count //第几级分类
 */
function tree(&$treeList, &$data, $level, $show_name, $field_name, $field_pid = 'pid', $field_id = 'id', $pid = 0, $count = 0)
{
    foreach ($data as $key => $value) {

        if ($value[$field_pid] == $pid) {
            $value[$level] = $count;
            $value[$show_name] = str_repeat('    ',$count).'|-'.$value[$field_name];
            $treeList[] = $value;
            unset($data[$key]);
            tree($treeList, $data, $level, $show_name, $field_name,$field_pid, $field_id, $value[$field_id], $count+1);
        }

    }
}
Hinweis :

1. $data
wurde nach ASC sortiert. Alle Daten 2. Die zurückgegebenen unendlichen Listendaten werden in $treeList

  • Der dritte Typ

    (es gibt Einschränkungen bei der Verwendung statischer Variablen: Wenn eine Anfrage zweimal aufgerufen wird, um zwei unendliche Klassifizierungen zu implementieren, treten Probleme auf, daher wird dies nicht empfohlen)

Hinweis:
    public function getTree($list, $parent_id, $level=0) {
        //应该是静态的局部变量,这样才能保证,在递归调用时,所有
        //的getTree方法,操作的是一个Tree空间。
        static $tree = array();//保存找到的分类的数组
        //遍历所有分类,通过parent_id判断,哪些是我们正在查找的
        foreach($list as $row) {
            //判断当前所遍历的分类$row, 是否是当前需要查找的子分类
            if($row['pid'] == $parent_id) {
                //找到了一个分类
                //存起来,存哪?
                $row['level'] = $level;
                $tree[] = $row;
                //继续查找当前$row所代表的分类的子分类
                $this->getTree($list, $row['id'], $level+1);
            }
        }
        return $tree;
    }
1. $list

ist bereits alle Daten nach ASC sortiert

Für weitere Artikel im Zusammenhang mit Best Practices für die unendliche PHP-Klassifizierung zahlen Sie bitte Achtung auf die chinesische PHP-Website!

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