Explode only by last delimiter

后端 未结 11 1676
隐瞒了意图╮
隐瞒了意图╮ 2021-01-03 17:30

is there a way to use explode function to explode only by last delimiter occurrence?

$string = "one_two_  ... _three_four";

$explodeResultArray = e         


        
11条回答
  •  心在旅途
    2021-01-03 18:26

    I had similar needs and inspired by @NLZ's answer I've made a reusable function with the same features as regular explode(), but backwards (although I added an option to reverse the array order contra regular explode()):

    function backward_explode($delimiter, $string, $limit = null, $keep_order = true) {
        if ((string)$delimiter === "") {
            return false;
        }
    
        if ($limit === 0 || $limit === 1) {
            return array($string);
        }
    
        $explode = explode($delimiter, $string);
    
        if ($limit === null || $limit === count($explode)) {
            return $keep_order? $explode : array_reverse($explode);
        }
    
        $parts = array();
    
        if ($limit > 0) {
            for ($i = 1; $i < $limit; $i++) {
                $parts[] = array_pop($explode);
            }
            $remainder = implode($delimiter, $explode);
            $parts[] = $remainder;
            if ($keep_order) {
                $parts = array_reverse($parts);
            }
        } else {
            if (strpos($string, $delimiter) === false) {
                return array();
            }
            $parts = $explode;
            array_splice($parts, 0, abs($limit));
            if (!$keep_order) {
                $parts = array_reverse($parts);
            }
        }
    
        return $parts;
    }
    

    (Also as a gist.)

    So with:

    $string = 'one two three four';
    var_dump(backward_explode(' ', $string));
    var_dump(backward_explode(' ', $string, 2));
    var_dump(backward_explode(' ', $string, 3));
    var_dump(backward_explode(' ', $string, 2, false));
    var_dump(backward_explode(' ', $string, -1));
    var_dump(backward_explode(' ', $string, 1)); // same as with $limit = 0
    var_dump(backward_explode('#', $string, -2));
    var_dump(backward_explode('', $string, 3));
    

    We get:

    array (size=4)
      0 => string 'one' (length=3)
      1 => string 'two' (length=3)
      2 => string 'three' (length=5)
      3 => string 'four' (length=4)
    array (size=2)
      0 => string 'one two three' (length=13)
      1 => string 'four' (length=4)
    array (size=3)
      0 => string 'one two' (length=7)
      1 => string 'three' (length=5)
      2 => string 'four' (length=4)
    array (size=2)
      0 => string 'four' (length=4)
      1 => string 'one two three' (length=13)
    array (size=3)
      0 => string 'two' (length=3)
      1 => string 'three' (length=5)
      2 => string 'four' (length=4)
    array (size=1)
      0 => string 'one two three four' (length=18)
    array (size=0)
      empty
    boolean false
    

提交回复
热议问题