web-dev-qa-db-ja.com

区切り文字の配列による爆発

区切り文字の配列を使用してexplode()を実行する方法はありますか?

PHPマニュアル:

配列の分解(string $ delimiter、string $ string [、int $ limit])

string $delimiterを使用する代わりに、パフォーマンスにあまり影響を与えずにarray $delimiterを使用する方法はありますか?

21
JoeC

preg_split() を適切な正規表現で使用します。

$str = 'Monsters are SUPER scary, bro!';
$del = array('a', 'b', 'c');

// In one fell swoop...
$arr = explode( $del[0], str_replace($del, $del[0], $str) );
57
65Fbef05
function explode_by_array($delim, $input) {
  $unidelim = $delim[0];
  $step_01 = str_replace($delim, $unidelim, $input); //Extra step to create a uniform value
  return explode($unidelim, $step_01);
}

これは@ 65Fbef05のコードを改善しました。 "+delim+"は元の文字列で使用される可能性があるため、最初の区切り文字を使用します。

6
Ale

最初の区切り文字の後の区切り文字にその最初の区切り文字の文字が含まれている場合、上記の提案は機能しません。たとえば、区切り文字として改行を使用したいが、入力で\ r\n、\ r、または単に\ nを使用しているかどうかわからない場合は、上記のメソッドを使用できません。

$str = '___RN___RN___R___N___RN___RN';
$del = array('RN', 'R', 'N');

# This won't work if delimiters 2, 3, n include characters from delimiter 1
var_dump(explode( $del[0], str_replace($del, $del[0], $str)));

これは出力します:

array(11) {
  [0]=>
  string(4) "___R"
  [1]=>
  string(0) ""
  [2]=>
  string(4) "___R"
  [3]=>
  string(0) ""
  [4]=>
  string(4) "___R"
  [5]=>
  string(3) "___"
  [6]=>
  string(4) "___R"
  [7]=>
  string(0) ""
  [8]=>
  string(4) "___R"
  [9]=>
  string(0) ""
  [10]=>
  string(0) ""
}

文字列の比較を計画している場合、これは理想的ではありません。代わりに、もう少し複雑にする必要があります。私が以下に書いたことは、最も効率的で簡潔ではないかもしれませんが、それはトリックを行います。

# This, however, will work
function array_explode($delimiters, $string){
    if(!is_array(($delimiters)) && !is_array($string)){
        //if neither the delimiter nor the string are arrays
        return explode($delimiters,$string);
    } else if(!is_array($delimiters) && is_array($string)) {
        //if the delimiter is not an array but the string is
        foreach($string as $item){
            foreach(explode($delimiters, $item) as $sub_item){
                $items[] = $sub_item;
            }
        }
        return $items;
    } else if(is_array($delimiters) && !is_array($string)) {
        //if the delimiter is an array but the string is not
        $string_array[] = $string;
        foreach($delimiters as $delimiter){
            $string_array = array_explode($delimiter, $string_array);
        }
        return $string_array;
    }
}

var_dump(array_explode($del,$str));

以下を出力します。

array(7) {
  [0]=>
  string(3) "___"
  [1]=>
  string(3) "___"
  [2]=>
  string(3) "___"
  [3]=>
  string(3) "___"
  [4]=>
  string(3) "___"
  [5]=>
  string(3) "___"
  [6]=>
  string(0) ""
}

遊びましょう: https://3v4l.org/bJOkI

0
dearsina