explode

来源:互联网 发布:五十音图软件 编辑:程序博客网 时间:2024/05/17 01:58
  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
原创粉丝点击