Разделять array как последовательность

Главным образом я нуждаюсь в том, чтобы сделать split array каждый раз, когда он нашел последовательность 8 непрерывных нулей:

базовый вектор

$vector = [1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0];

Код, который я изменил, чтобы реализовывать поиски последовательностей непрерывных 8:

function BuscarEnVector($vectorBuscar, $vector) 
{
    $listaIndices = array_keys($vector, $vectorBuscar[0]);
    $ret = [];

    foreach ($listaIndices as $indice) 
    {
        $adicionar = true;
        $resultado = [];

        foreach ($vectorBuscar as $i => $valor) 
        {
            if (!(isset($vector[$indice + $i]) && $vector[$indice + $i] == $valor)) 
            {
                $adicionar = false;
                break;
            }

            $resultado[] = $indice + $i;
        }

        if ($adicionar == true) 
        { 
            $ret[] = $resultado;
        }           
    }

    return $ret;
}

Использование

$vectorCoincidencias = BuscarEnVector([0,0,0,0,0,0,0,0], $vector);

Полученный результат:

Array
(
    [0] => Array
        (
            [0] => 3
            [1] => 4
            [2] => 5
            [3] => 6
            [4] => 7
            [5] => 8
            [6] => 9
            [7] => 10
        )

    [1] => Array
        (
            [0] => 14
            [1] => 15
            [2] => 16
            [3] => 17
            [4] => 18
            [5] => 19
            [6] => 20
            [7] => 21
        )

)

Ожидаемый результат:

индекса 0 в 2 нет непрерывных нулей

индекса 3 в 10 есть 8 непрерывных нулей

индекса 11 в 13 нет непрерывных нулей

индекса 14 в 21 есть 8 непрерывных нулей

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
        )
    [1] => Array
        (
            [0] => 3
            [1] => 4
            [2] => 5
            [3] => 6
            [4] => 7
            [5] => 8
            [6] => 9
            [7] => 10
        )
    [2] => Array
        (
            [0] => 11
            [1] => 12
            [2] => 13
        )       
    [3] => Array
        (
            [0] => 14
            [1] => 15
            [2] => 16
            [3] => 17
            [4] => 18
            [5] => 19
            [6] => 20
            [7] => 21
        )
)

Что я должен изменять, чтобы считать результат ожидаемым?

3
задан 23.10.2016, 04:54
3 ответа

Здесь я оставляю возможность. Состой из функции, в которую ты перемещаешь его array, который будет использоваться как разделитель ($needle) и array, который ты хочешь отделить ($array), тогда работает следующий алгоритм:

  1. Обращать arrays в цепи текста
  2. Добавлять разделители впереди и за цепью, искавшей (p.e. используя preg_replace).
  3. Ломать цепь из-за разделителей (p.e.: используя preg_split что позволяет тебе удалять пустые элементы, которые остались бы, если искавшая цепь сначала и(или) в конце концов).
  4. Ломать внутренние элементы array в array индивиды (p.e. используя str_split).
  5. Возвращать произведенный array.

Здесь я оставляю пример кода:

function separarVector($needle, $array){

    // convertimos los dos arrays en cadenas de texto
    $needle2 = implode("",$needle);
    $array2  = implode("", $array);

    // usamos expresiones regulares para añadir comas delante y detrás de la cadena buscada
    $array2  = preg_replace("/" . $needle2 . "/", "," . $needle2 . ",", $array2);

    // usamos expresiones regulares para convertirlo en un array
    $array2  = preg_split("/,/", $array2, 0, PREG_SPLIT_NO_EMPTY);

    // separa las cadenas internas en arrays
    for($x = 0; $x < count($array2); $x++) {
        $array2[$x] = str_split($array2[$x]);
    }

    // devuelve el array de arrays
    return $array2;

}

$vector  = [0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0];
$vector2 = separarVector([0,0,0,0,0,0,0,0], $vector);
print_r($vector2);

$vector  = [1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0];
$vector2 = separarVector([0,0,0,0,0,0,0,0], $vector);
print_r($vector2);
1
ответ дан 24.11.2019, 14:35

Эта funciГіn возвращает тебе результат, который ты ждешь:

function splitVector($param, $array){

  $total = count($param);
  $atotal = count($array);
  $i = 0;
  $k = 0;
  $output = array();
  while($i < $atotal){
      if(!isset($output[$k])) $output[$k] = array();
      if ($param ==  array_slice($array,$i,$total)){
          $k++;
          for($o = 0; $o < $total; $o++){
              $output[$k][] = $i;
              $i++;
          }
          $k++;
      }else{
          $output[$k][]  = $i;    
          $i++;
      }
  }
  return $output;
}

$vector = [1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0];
$vectores = splitVector([0,0,0,0,0,0,0,0], $vector);
1
ответ дан 24.11.2019, 14:35

Я создал эту funciГіn, что возвращает результат, который ты ждешь, скажи мне, решает ли проблема тебя:

function SplitAfter($param, $array){

    foreach($array as $key => $value){
        $string .= $value.',';
    }

    $string = substr($string, 0, -1);

    $output = preg_split( '/('.$param.')/' , $string , -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY );


    foreach($output as $key => $value){
        $output[$key] = preg_split( '/,/' , $value , -1, PREG_SPLIT_NO_EMPTY );
    }

    return $output;

}

$vector = [1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0];
$vectores = SplitAfter(',0,0,0,0,0,0,0,0', $vector);
0
ответ дан 24.11.2019, 14:35
  • 1
    #191; Цюй и # 233; перемести, если 8 непрерывных нулей est и # 225; n сначала? – Alvaro Montoro♦ 15.04.2016, 23:28
  • 2
    @webly, первая пара и # 225; метр funci и # 243; n - string, это не вектор, следовательно твой soluci и # 243; n она не правильна. В любом случае большое спасибо. – Daniel Corzo 16.04.2016, 01:49

Теги

Похожие вопросы