Разделить массив по последовательности


в основном мне нужно сделать split в массив каждый раз, когда я нахожу последовательность из 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
        )
)

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

Author: Comunidad, 2016-04-15

3 answers

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

  1. преобразование массивов в текстовые строки
  2. Добавить разделители перед и за искомой строкой (например, используя preg_replace).
  3. разорвать строку разделителями (например: с помощью preg_split что позволяет удалять элементы пустые, которые останутся, если искомая строка находится в начале и / или в конце).
  4. разбить внутренние элементы массива на отдельные array (например, используя str_split).
  5. возвращает сгенерированный массив.

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

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
Author: Alvaro Montoro, 2016-04-15 21:00:32

Эта функция возвращает вам результат, который вы ожидаете:

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
Author: ddiestra, 2016-04-15 20:32:28

Я создал эту функцию, которая возвращает результат, который вы ожидаете, скажите мне, если это решит проблему для вас:

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
Author: Infobuscador, 2016-04-15 19:54:28