2015-06-04 4 views
2

Я пытаюсь взорвать строку, используя несколько разделителей (↑↑ , ↑ , ↓↓ , ↓).Как я могу взорвать строку несколькими разделителями, а также сохранить разделители?

Например, у меня есть эта intput строка:

$string = "(2.8 , 3.1) → (↓↓2.4 , ↓3.0)"; 

Я хотел бы, чтобы преобразовать его в массив, как этот (ожидается выход):

Array 
(
    [0] => (2.8 , 3.1) → (
    [1] => ↓↓ 
    [2] => 2.4 , 
    [3] => ↓ 
    [4] => 3.0) 
) 

Моя лучшая попытка принты меня это (текущий выход):

Array 
(
    [0] => (2.8 , 3.1) → (
    [1] => ↓ 
    [2] => ↓2.4 , 
    [3] => ↓3.0) 
) 

Это мой текущий код:

<?php 

    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)) 
       ) 
      ) 
     ); 
    } 

    $delimiters = array('↑↑','↑','↓↓','↓'); 
    $test = array('2up↑↑','1up↑','2down↓↓','1down↓'); 
    $newDel = array('2up','1up','2down','1down'); 
    $array = array(); 

    $strings = array(
     "(2.8 , 3.1) → (↓↓2.4 , ↓3.0)", 
     "(2.7 , 2.6) → (↑2.8 , ↑↑3.0)", 
     "(2.0 , 3.4) → (↑↑2.8 , ↓↓2.3)" 
    ); 

    foreach($strings as $string){ 
     foreach($test as $key => $reps){ 
      $string = str_replace(    
       $delimiters[$key], 
       $reps, 
       $string 
      ); 
     } 
     //echo $string; 
     $array[] = array_values(array_filter(multiexplode($newDel,$string))); 
    } 

?> 

Я строю его, как этот формат, потому что я собираюсь цикла эти значения и напечатать те внутри PowerPoint и эти разделители (стрелки) имеют разные цвета

ответ

6

Это должно работать для вас:

Просто используйте preg_split() и установите флаги для хранения разделителей. Например.

<?php 

    $string = "(2.8 , 3.1) → (↓↓2.4 , ↓3.0)"; 
    $arr = preg_split("/(↑↑|↑|↓↓|↓)/", $string, -1, PREG_SPLIT_DELIM_CAPTURE); 
    print_r($arr); 

?> 

выход:

Array 
(
    [0] => (2.8 , 3.1) → (
    [1] => ↓↓ 
    [2] => 2.4 , 
    [3] => ↓ 
    [4] => 3.0) 
) 
+0

deym. не знал, что это может быть всего лишь 3 кода лайнера. Спасибо – roullie

+0

@roullie Добро пожаловать. Наслаждайтесь своим днем ​​:) – Rizier123

+0

ответ будет принят через 6 минут – roullie