Разделить массив по последовательности
в основном мне нужно сделать 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
)
)
что я должен изменить, чтобы иметь ожидаемый результат?
3 answers
Здесь я оставляю возможность. Он состоит из функции, которой вы передаете массив, который будет использоваться в качестве разделителя ($needle
), и массив, который вы хотите разделить ($array
), Затем выполняется следующий алгоритм:
- преобразование массивов в текстовые строки
- Добавить разделители перед и за искомой строкой (например, используя
preg_replace
). - разорвать строку разделителями (например: с помощью
preg_split
что позволяет удалять элементы пустые, которые останутся, если искомая строка находится в начале и / или в конце). - разбить внутренние элементы массива на отдельные array (например, используя
str_split
). - возвращает сгенерированный массив.
Здесь я оставляю пример кода:
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);
Эта функция возвращает вам результат, который вы ожидаете:
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);
Я создал эту функцию, которая возвращает результат, который вы ожидаете, скажите мне, если это решит проблему для вас:
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);