Разрыв по массиву разделителей

Есть ли способ взорвать (), используя массив разделителей?

Руководство по PHP:

массив взрывается (строка $delimiter, строка $string [, int $limit])

Вместо использования string $delimiter есть ли способ использовать array $delimiter, не слишком влияя на производительность?


person JoeC    schedule 18.05.2010    source источник


Ответы (5)


Используйте preg_split() с соответствующим регулярным выражением.

person Ignacio Vazquez-Abrams    schedule 18.05.2010
comment
Например: print_r(preg_split("/[,. ]/", "0 1,2.3")); даст вам Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3). - person sirhc; 18.05.2010
comment
print_r(preg_split("/[,\. ]/", "0 1,2.3")); вы имеете в виду :) Спасибо, наверное, лучший способ, я думаю. - person JoeC; 18.05.2010

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+".

person Ale    schedule 07.07.2012

Приведенные выше предложения не будут работать, если разделители после первого разделителя включают символы из этого первого разделителя. Например, если вы хотите использовать разрывы строк в качестве разделителей, но не уверены, использует ли ваш ввод \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

person dearsina    schedule 08.08.2018

Метод взрыва php не поддерживает несколько разделителей, поэтому вы не можете передать ему массив. Кроме того, какую строку вы анализируете с несколькими разделителями? вам лучше всего было бы перебрать ваши разделители и повторно взорвать некоторые из взорванных строк.

person GSto    schedule 18.05.2010

person    schedule
comment
Это должно быть быстрее, чем регулярные выражения, хорошо. - person Pioul; 21.04.2012
comment
это удивительное, блестящее и простое решение, респект! - person Somal Somalski; 16.05.2013
comment
Отличный, но я бы предпочел версию Але. Это сбоит с конечным первым разделителем. - person user568109; 16.12.2013
comment
@user568109 user568109 Я уверен, что мне просто не хватает воображения, но я не вижу в этом ошибки/глюка. - person Joel Mellon; 23.03.2014
comment
После слишком долгого изучения этой страницы я предполагаю, что ответ 65Fbef05 был изменен, чтобы устранить ошибку. - person Joel Mellon; 24.03.2014
comment
@sudopeople На самом деле я никогда не обращался к проблеме пользователя 568109, последнее изменение в моем ответе было задолго до их комментария. Не совсем уверен, что они имели в виду. - person 65Fbef05; 27.03.2014
comment
@ 65Fbef05 Что ж, думаю, я в той же лодке. Я все еще не вижу никаких проблем с вашим кодом. - person Joel Mellon; 01.05.2014