php如何對 mysql 中text類型拆分存入一個數組_PHP遞歸實現無限級分類,可選返回字符串和數組...

正 文:

在一些復雜的系統中,要求對信息欄目進行無限級的分類,以增強系統的靈活性。那么PHP是如何實現無限級分類的呢?我們在本文中使用遞歸算法并結合mysql數據表實現無限級分類。

遞歸,簡單的說就是一段程序代碼的重復調用,當把代碼寫到一個自定義函數中,將參數等變量保存,函數中重復調用函數,直到達到某個條件才跳出,返回相應的數據。

Mysql

首先我們準備一張數據表class,記錄商品分類信息。表中有三個字段,id:分類編號,主鍵自增長;title:分類名稱;pid:所屬上級分類id。

class表結構:

CREATE?TABLE?IF?NOT?EXISTS?`class`?(

`id`?mediumint(6)?NOT?NULL?AUTO_INCREMENT,

`title`?varchar(30)?NOT?NULL,

`pid`?mediumint(6)?NOT?NULL?DEFAULT?'0',

PRIMARY?KEY?(`id`)

)?ENGINE=MyISAM??DEFAULT?CHARSET=utf8;

插入數據后,如圖:

5db55f16fcecbbae774920051113237a.png

PHP

根據不同的需求,我們提供兩種不同格式的自定義函數,一種是返回字符串,一種是返回數組,兩種函數都使用了遞歸方法。先看返回字符串格式的函數:

function?get_str($id?=?0)?{

global?$str;

$sql?=?"select?id,title?from?class?where?pid=?$id";

$result?=?mysql_query($sql);//查詢pid的子類的分類

if($result?&&?mysql_affected_rows()){//如果有子類

$str?.=?'

  • ';

while?($row?=?mysql_fetch_array($result))?{?//循環記錄集

$str?.=?"

"?.?$row['id']?.?"--"?.?$row['title']?.?"";?//構建字符串

get_str($row['id']);?//調用get_str(),將記錄集中的id參數傳入函數中,繼續查詢下級

}

$str?.=?'

';

}

return?$str;

}

以上函數get_str()通過遞歸,不斷查詢下級分類,并最終返回字符串,大家可以根據項目需求修改其中的str,最終生成一個無限分級列表:

include_once('connect.php');?//連接數據庫,connect.php文件自己寫一個啊

echo?get_str(0);?//輸出無限級分類

效果如:

d77a8d3fc19fe9c853e846962755fadf.png

接著我們來看返回數組格式的函數,一樣要使用遞歸:

function?get_array($id=0){

$sql?=?"select?id,title?from?class?where?pid=?$id";

$result?=?mysql_query($sql);//查詢子類

$arr?=?array();

if($result?&&?mysql_affected_rows()){//如果有子類

while($rows=mysql_fetch_assoc($result)){?//循環記錄集

$rows['list']?=?get_array($rows['id']);?//調用函數,傳入參數,繼續查詢下級

$arr[]?=?$rows;?//組合數組

}

return?$arr;

}

}

函數get_array()返回了數組,這是我們期待的,所以筆者推薦使用get_array()得到數組,這樣一來,我們可以對數組進行任意操作,比如我們可以將數組轉換成json格式的數據傳給前端頁面,前端頁面可以通過解析json數據靈活展示分類信息。比如樹形結構的分類列表,下拉分類列表等。

include_once('connect.php');?//連接數據庫

$list?=?get_array(0);?//調用函數

print_r($list);?//輸出數組

輸出效果如:

d5fe9f05465ed38baeca815b2cfbba77.png

如果要輸出json格式的數據,則可使用:

echo?json_encode($list);

(參考:PHP遞歸實現無限級分類)

比如飄易實際中用到的,把無限級分類放到?select?元素中:

//遞歸無限極?讀取所有分組

$qian_i=0;

function?get_group_str($id?=?0)?{

global?$conn,$qian_i;

$sql?=?"select?*?from?`group`?where?fid=?$id";

$result?=?mysql_query($sql);//查詢pid的子類的分類

if($result?&&?mysql_affected_rows()){//如果有子類

$qian_i++;

while?($row?=?mysql_fetch_array($result))?{?//循環記錄集

$qian?=?str_repeat(" ",?($qian_i-1)*6);

$str?.=?"$qian"?.?$row['title']?.?"";?//構建字符串

$str?.=?get_group_str($row['id']);?//遞歸調用函數本身,將記錄集中的id參數傳入函數中,繼續查詢下級

}

$qian_i--;

}

return?$str;

}

$opt="頂級分組";

$opt.=get_group_str(0);

注意,實際使用中請將上面紅色的全角空格代碼轉換成半角代碼。

效果圖:

0ade752500736a8f463663e4ad386004.png

再看下另外一種不錯的遞歸寫法:

/**

*?select選項?-?遞歸無限級?讀取所有分類

*?輸出數組,?可轉json字符串供前端轉換成js對象

*/

function?digui_js(?$id=0?)?{

global?$db;

$dgArr=[];

$cats?=?db_select_all(?"meeting_types",?"parent_id=$id?order?by?sort_id?desc,id?asc"?);

if?(?$cats!=null?)?{

foreach?(?$cats?as?$cat?)?{?//循環

$dgArr[]?=?["id"=>$cat["id"],?"title"=>$cat["title"],?"subset"=>digui_js(?$cat["id"]?)];

}

}

return?$dgArr;

}

$digui_js?=?json_encode(digui_js());

print_r($digui_js);

本文結束。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534243.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 開發框架 ant_Golang/python語言開發的分布式游戲服務器框架 mqant

軟件介紹mqantmqant 是一款基于 Golang 語言的簡潔,高效,高性能的分布式游戲服務器框架,研發的初衷是要實現一款能支持高并發,高性能,高實時性的游戲服務器框架,也希望 mqant 未來能夠做即時通訊和物聯網方…

java w3c xml_org.w3c.dom(java dom)解析XML文檔

首先來了解點Java DOM 的 API:1.解析器工廠類:DocumentBuilderFactory創建的方法:DocumentBuilderFactory dbf DocumentBuilderFactory.newInstance();2.解析器:DocumentBuilder創建方法:通過解析器工廠類來獲得 DocumentBuilder…

java中小數點位數_Java中限制小數位數問題

在Java中限制小數位數的方法不止一種,下面我們以限制兩位小數為例來說明幾種限制小數位數的方法,其他位數可以以此類推方式一:四舍五入double f 111231.5585;BigDecimal b new BigDecimal(f);double f1 b.setScale(2,…

orange pi java_[中文]Orange Pi家族各大成員一覽表

全部復制來自官網,只修改了錯別字和優化了排版。Orange Pi Zero香橙派Zero是一款開源的單板電腦,新一代的arm開發板,它可以運行Android4.4、Ubuntu、Debian等操作系統。香橙派Zero使用全志H2系統級芯片,同時擁有256MB/512MB DDR3 內存(256MB為…

java 微服務源碼_基于Java的微服務架構源碼案例Abixen

微服務越來越受歡迎,每個月都有更多的庫包和解決方案來支持微服務的開發測試,很多Java開發人員雖然聽說過微服務,但是真正采用還是有猶豫的:“我知道,微服務是非常棒的,微服務器更容易維護和進一步開發&…

rocketmq java例子_SpringBoot和RocketMQ的簡單實例

1,引用jar包build.gradle文件添加jar包引用compile group: org.apache.rocketmq, name: rocketmq-spring-boot-starter, version: 2.1.12,配置文件application.properties 配置文件spring.application.nameapp-dempserver.port8081###rocketmq###rocketm…

mysql migrations_Code First Migrations更新數據庫結構(數據遷移)

背景 code first起初當修改model后,要持久化至數據庫中時,總要把原數據庫給刪除掉再創建(DropCreateDatabaseIfModelChanges),此時就會產生一個問題,當我們的舊數據庫中包含一些測試數據時,當持久化更新后,…

java 機器碼 虛擬機_Java虛擬機:源碼到機器碼

無論什么語言寫的代碼,其到最后都是通過機器碼運行的,無一例外。那么對于 Java 語言來說,其從源代碼到機器碼,這中間到底發生了什么呢?這就是今天我們要聊的。如下圖所示,編譯器可以分為:前端編…

docker 遠程連接 文件看不到_開發提升十倍生產力: IDEA 遠程一鍵部署 Spring Boot 到 Docker...

一、開發前準備二、新建項目《Java 2019 超神之路》《Dubbo 實現原理與源碼解析 —— 精品合集》《Spring 實現原理與源碼解析 —— 精品合集》《MyBatis 實現原理與源碼解析 —— 精品合集》《Spring MVC 實現原理與源碼解析 —— 精品合集》《Spring Boot 實現原理與源碼解析…

java多臺_Java 多態

Java中多態的特性,在學習中就是很難懂,比較抽象的概念。學的時候就犯糊涂,但日后會發現,基礎在日常工作的理解中占有重要的角色。下面,我將用一個代碼實例,回憶和鞏固多態的概念和存在的意義。理解多態&…

快準牌電腦發軟件_做自媒體必備技能,視頻剪輯軟件排名(精品篇)

作者:老馬引流定位:專業專注引流推廣0X00 前言毫不客氣的說,視頻正日益成為社交媒體和營銷的重要組成部分,有越來越多的人參與到視頻剪輯當中來,而其中最為關鍵的就是視頻剪輯軟件。而市面上的視頻剪輯軟件當然也是五花…

ad電阻原理圖_【雕爺學編程】Arduino動手做(2)---光敏電阻模塊

【Arduino】108種傳感器模塊系列實驗(02)實驗二:光敏電阻傳感器模塊我手里這塊是三針版的,挺秀氣吧光敏電阻是用硫化隔或硒化隔等半導體材料制成的特殊電阻器,其工作原理是基于內光電效應。光照愈強,阻值就…

java從url下載文件_Java從URL下載文件

在這篇文章中將學習如何從java下載URL中的文件。使用java.net.URL openStream()方法從java程序中的URL下載文件。也可以使用Java NIO Channels或Java IO InputStream從URL打開流中讀取數據,然后將它保存到文件中。下面是從指定URL下載的簡單Java程序。它演示了如何在…

怎么判斷一個字符串的最長回文子串是否在頭尾_LeetCode 第 131 號問題:分割回文串...

題目來源于 LeetCode 上第 131 號問題:分割回文串。題目難度為 Medium,目前通過率為 45.8% 。題目描述給定一個字符串 s,將 s 分割成一些子串,使每個子串都是回文串。返回 s 所有可能的分割方案。示例:輸入題目解析首先&#xff0…

java的地位_Java地位無可動搖的12個原因

如今,面對曾經在程序員中被各種新技術掩蓋直至堙滅的技術值得懷念。猶如COBOL這當年被老程序員們尊為神器的語言如今也基本沒有價值。而Java作為現代程序員的中堅力量在這點上會不會成為下一個COBOL?有關JAVA的技術賣出多少本書已經是一個很久遠的記憶了…

hystrix threadpool coresize_Hystrix斷路器 - 求知若渴的蝸牛

Hystrix介紹在微服務場景中,通常會有很多層的服務調用。如果一個底層服務出現問題,故障會被向上傳播給用戶。我們需要一種機制,當底層服務不可用時,可以阻斷故障的傳播。這就是斷路器的作用。他是系統服務穩定性的最后一重保障。在…

ionic保存到mysql_ionic sqlite 存取數據封裝(兼容真機與webkit瀏覽器)

不管是真機還是H5,都有提供sqlite數據庫進行存儲數據。那么我們只要封裝好函數就能隨意調用了。如果只是存儲簡單的鍵值對形式的話,ionic官網也提供了一個兼容網頁的storage,https://ionicframework.com/docs/storage,但只能key/v…

sql plus 表的總記錄數是多少_直播回顧 | 億級并發絲毫不虛,TDSQL-SQL引擎是如何煉成的...

騰訊云數據庫國產數據庫專題線上技術沙龍正在火熱進行中,3月19日唐顥的分享已經結束,沒來得及參與的小伙伴不用擔心,以下就是直播的視頻和文字回顧。關注“騰訊云數據庫”公眾號,回復“0319唐顥”,即可下載直播分享PPT…

java plug機制_插件機制 - OpooPress - 基于 Java 的靜態博客生成器

插件機制通過插件機制可以很容易的擴展 OpooPress 博客系統的功能。 Plugin 定義如下public interface Plugin{/**** param registry*/void initialize(Registry registry);}Registry 接口定義如下:public interface Registry {Site getSite();void registerConvert…

運放放大倍數計算公式_19.運算放大器的特性與應用,不得不掌握的知識點(一)...

運算放大器,簡稱“運放”,是電力電子中最重要的器件之一,主要作用為:信號放大、信號運算、信號處理、波形的產生和變換。一、運算放大器的內部結構集成運算放大器內部結構集成運算放大器內部一般由四個單元組成,各單元…