explode

  1. 函数说明

    /**
     * 使用一个字符串分割另一个字符串
     * @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 ] )
  2. 实现流程

    1. 判断参数
      • $limit 默认为 PHP_INT_MAX
      • 判断分隔符是否为空,如果为空返回 false
      • 判断字符串长度,如果字符串为空且 $limit >= 0,返回一个包含空字符串的数组;如果字符串长度小于分隔符长度,返回空数组
    2. 执行逻辑
      根据 $limit 值执行不同逻辑
      • $limit > 1
        if 找不到分隔符,直接返回一个包含整个字符串的数组;
        else 循环找分隔符,将被分隔的字符串加入数组,跳出循环后,将最后一个字符串加入数组
      • $limit < 0
        if 找不到分隔符,返回空数组;
        else 保存每个字符串的起始位置 $positions[],以及字符串数目 $found$toReturn = $limit + $found,根据 $toReturn 以及 $positions[] 返回字符串数组
      • $limit == 0 || $limit == 1
        返回一个包含整个字符串的数组;
  3. 实现代码

    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));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值