函数说明
/** * 使用一个字符串分割另一个字符串 * @param string $delimiter * 边界上的分隔字符 * @param string $string * 输入的字符串 * @param int $limit * 如果设置了 limit 参数并且是正数,则返回的数组包含最多 limit 个元素, * 而最后那个元素将包含 string 的剩余部分 * 如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素 * 如果 limit 是 0,则会被当做 1,返回整个字符串 * @return array | false */ explode ( $delimiter, string $string, [, int $limit ] )
实现流程
- 判断参数
$limit
默认为PHP_INT_MAX
- 判断分隔符是否为空,如果为空返回
false
- 判断字符串长度,如果字符串为空且
$limit >= 0
,返回一个包含空字符串的数组;如果字符串长度小于分隔符长度,返回空数组
- 执行逻辑
根据$limit
值执行不同逻辑
$limit > 1
if
找不到分隔符,直接返回一个包含整个字符串的数组;
else
循环找分隔符,将被分隔的字符串加入数组,跳出循环后,将最后一个字符串加入数组$limit < 0
if
找不到分隔符,返回空数组;
else
保存每个字符串的起始位置$positions[]
,以及字符串数目$found
,$toReturn = $limit + $found
,根据$toReturn
以及$positions[]
返回字符串数组$limit == 0 || $limit == 1
返回一个包含整个字符串的数组;
- 判断参数
实现代码
function myExplode($delimiter, $str, $limit = PHP_INT_MAX) { //如果分隔符为空,返回false if ($delimiter == "") { return false; } $arr = array(); //如果字符串为空且 $limit >= 0 返回空字符串数组 if (strlen($str) == 0 && $limit >= 0) { $arr[] = ""; return $arr; } //如果字符串长度<=分隔符长度,返回空数组 if (strlen($str) <= strlen($delimiter)) { return $arr; } if ($limit > 1) { $arr = explodePositive($delimiter, $str, $limit); } elseif ($limit < 0) { $arr = explodeNegative($delimiter, $str, $limit); } else { $arr[] = $str; } return $arr; } function explodePositive($delimiter, $str, $limit) { $start = 0; $arr = array(); if ($pos = strpos($str, $delimiter, $start)) { do { $arr[] = substr($str, $start, $pos - $start); $start = $pos + strlen($delimiter); $pos = strpos($str, $delimiter, $start); } while ($pos && --$limit > 1); // 将末尾的字符串加入数组 $arr[] = substr($str, $start); } else { $arr[] = ""; } return $arr; } function explodeNegative($delimiter, $str, $limit) { $start = 0; $arr = array(); if ($pos = strpos($str, $delimiter, $start)) { do { $posArr[] = $pos; $start = $pos + strlen($delimiter); $pos = strpos($str, $delimiter, $start); } while ($pos); $toReturn = count($posArr) + $limit + 1; $start = 0; for ($i = 0; $i < $toReturn; $i++) { $arr[$i] = substr($str, $start, $posArr[$i] - $start); $start = $posArr[$i] + strlen($delimiter); } } return $arr; } //测试代码 $str = "www.sina.com"; print_r('explode(\'\', $str)'); var_dump(explode('',$str)); print_r('myExplode(\'\',$str)'); var_dump(myExplode('',$str)); print_r('explode($str, \'.\')'); var_dump(explode('.',$str)); print_r('myExplode($str, \'.\')'); var_dump(myExplode('.',$str)); print_r('explode($str, \'.\', 1)'); var_dump(explode('.', $str, 1)); print_r('myExplode($str, \'.\', 1)'); var_dump(myExplode('.',$str, 1)); print_r('explode($str, \'.\', 2)'); var_dump(explode('.',$str, 2)); print_r('myExplode($str, \'.\', 2)'); var_dump(myExplode('.',$str, 2)); print_r('explode($str, \'.\', -2)'); var_dump(explode('.',$str, -2)); print_r('myExplode($str, \'.\', -2)'); var_dump(myExplode('.',$str, -2)); print_r('explode($str, \'.\', -3)'); var_dump(explode('.',$str, -3)); print_r('myExplode($str, \'.\', -3)'); var_dump(myExplode('.',$str, -3)); print_r('explode($str, \'.\', -4)'); var_dump(explode('.',$str, -4)); print_r('myExplode($str, \'.\', -4)'); var_dump(myExplode('.',$str, -4));
explode
最新推荐文章于 2023-05-18 22:14:16 发布