У меня проблема, у меня есть строковый массив, и я хочу взорваться в другом разделителе. Например
$example = 'Appel @ Ratte'; $example2 = 'apple vs ratte'
и мне нужен массив, который взорвался в @ или vs.
Я уже написал решение, но если у каждого есть лучшее решение, напишите здесь.
private function multiExplode($delimiters,$string) { $ary = explode($delimiters[0],$string); array_shift($delimiters); if($delimiters != NULL) { if(count($ary) <2) $ary = $this->multiExplode($delimiters, $string); } return $ary; }
как насчет использования
$ output = preg_split ("/ (@ | vs) /", $ input);
Вы можете взять первую строку, заменить все @
с помощью vs
используя str_replace
, а затем взорвать vs
или наоборот.
function multiexplode ($delimiters,$string) { $ready = str_replace($delimiters, $delimiters[0], $string); $launch = explode($delimiters[0], $ready); return $launch; } $text = "here is a sample: this text, and this will be exploded. this also | this one too :)"; $exploded = multiexplode(array(",",".","|",":"),$text); print_r($exploded); //And output will be like this: // Array // ( // [0] => here is a sample // [1] => this text // [2] => and this will be exploded // [3] => this also // [4] => this one too // [5] => ) // )
Источник: php @ metehanarslan на php.net
Не будет ли strtok()
работать для вас?
Как насчет использования strtr()
для замены всех ваших других разделителей на первый?
private function multiExplode($delimiters,$string) { return explode($delimiters[0],strtr($string,array_combine(array_slice($delimiters,1),array_fill(0,count($delimiters)-1,array_shift($delimiters)))))); }
Кажется, это нечитаемо, но я тестировал его как работающий здесь.
Однострочные ftw!
Просто вы можете использовать следующий код:
$arr=explode('sep1',str_replace(array('sep2','sep3','sep4'),'sep1',$mystring));
У вас возникнут некоторые проблемы (например, если у вас есть эта строка: «vs @ apples»), используя этот метод sepparating, но если мы начнем с того, что вы подумали об этом и устранили все эти возможные столкновения, вы могли бы просто заменить все вхождения $delimiter[1]
на $delimiter[n]
с помощью $delimiter[0]
, а затем разделить на этот первый?
Если ваш разделитель – это только символы, вы можете использовать strtok
, который, кажется, более подходит здесь. Обратите внимание, что вы должны использовать его с циклом while для достижения эффекта.
Я делаю это так …
public static function multiExplode($delims, $string, $special = '
') { if (is_array($delims) == false) { $delims = array($delims); } if (empty($delims) == false) { foreach ($delims as $d) { $string = str_replace($d, $special, $string); } } return explode($special, $string); }
Это будет работать:
$stringToSplit = 'This is my String!' ."\n\r". 'Second Line'; $split = explode ( ' ', implode ( ' ', explode ( "\n\r", $stringToSplit ) ) );
Как вы можете видеть, он сначала склеивает части с разнесенными частицами вместе с пространством, а затем снова разделяет его, на этот раз снимая с ним пробелы.
Вы можете попробовать это решение …. Он отлично работает
function explodeX( $delimiters, $string ) { return explode( chr( 1 ), str_replace( $delimiters, chr( 1 ), $string ) ); } $list = 'Thing 1&Thing 2,Thing 3|Thing 4'; $exploded = explodeX( array('&', ',', '|' ), $list ); echo '<pre>'; print_r($exploded); echo '</pre>';
Ссылка: http://www.phpdevtips.com/2011/07/exploding-a-string-using-multiple-delimiters-using-php/