PHP 字串分割成陣列函式 explode, str_split 內部實現
將一個字串分割成陣列在日常開發中的應用應該是很多的。如果指定分割符,可以使用explode,如果沒有分割符,可以使用split實現。 那麼兩個函式內部如何實現,有什麼不同呢?
str_split
str_split — 將字串轉換為陣列
如果指定了可選的 split_length 引數,返回陣列中的每個元素均為一個長度為 split_length 的字元塊。
沒有split_length引數,每個字元塊為單個字元。
如果 split_length 小於 1,返回 FALSE。
如果 split_length 引數超過了 string 超過了字串 string 的長度,整個字串將作為陣列僅有的一個元素返回。
對於字串直接按長度切分,一般的做法就是直接遍歷字串,以指定的長度為步長擷取子串放入陣列中。
首先擷取長度進行判斷,如果小於1直接返回空。
然後判斷需要分割字串的長度與擷取長度關係,如果擷取長度大於等於字串長度,則返回一個只包含一個元素的陣列。
那原字串長度與擷取長度確定迴圈次數。每次迴圈中擷取一個子串新增到陣列中。 while
在沒有整除的時候,會遺漏最後一串字元。所以在最後使用一個 if 進行判斷。
explode
explode — 使用一個字串分割另一個字串
如果設定了 limit 引數並且是正數,則返回的陣列包含最多 limit 個元素,而最後那個元素將包含 string 的剩餘部分。
如果 limit 引數是負數,則返回除了最後的 -limit 個元素外的所有元素。
如果 limit 是 0,則會被當做 1。
php_memnstr
獲取字串在另一個字串第一次出現的位置。
如果不存在分割字串,則直接返回包含原字串組成的陣列
通過 do
迴圈分別獲取分隔符之間的字串。 limit>1
保證最後一個數組元素包含字串剩下部分。
兩個函式內部實現異同
str_split 使用 add_next_index_stringl 擷取字元新增到陣列中。explode使用zend_hash_next_index_insert_new。
內部都是迴圈擷取字串實現分割字元。