массив порций по пробелу - PullRequest
0 голосов
/ 29 октября 2018

У меня есть массив из функции array_diff, и он выглядит так:

Array
(
    [0] => world
    [1] => is
    [2] => a
    [3] => wonderfull
    [5] => in
    [6] => our
)

Как видите, у нас есть разрыв между ключами № 3 и № 5 (т.е. нет ключа № 4). Как я могу разделить этот массив на 2 части, или, может быть, больше, если есть больше пробелов? Ожидаемый результат будет:

Array
    (
        [0] => Array
        (
           [0] => world
           [1] => is
           [2] => a
           [3] => wonderfull
        )
        [1] => Array 
        (
           [0] => in
           [1] => our
        ) 
    )

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Вы можете использовать концепцию old_key, new_key, чтобы проверить, есть ли разница 1 или нет? если нет, то создайте новый индекс внутри вашего результирующего массива, иначе добавьте значения в тот же индекс: -

<?php

$arr = Array(0 => 'world',1 => 'is',2 => 'a',3 => 'wonderfull',5 => 'in',6 => 'our');

$new_array = [];
$old_key = -1;
$i = 0;
foreach($arr as $key=>$val){
    if(($key-$old_key) ==1){
        $new_array[$i][] = $val;
        $old_key = $key;
    }
    if(($key-$old_key) >1){
         $i++;
         $new_array[$i][] = $val;
         $old_key = $key;
    }
}
print_r($new_array);

https://3v4l.org/Yl9rp

0 голосов
/ 14 ноября 2018

Вы еще не получили отточенное / полностью продуманное решение, поэтому я предложу его.

При определении необходимости создания нового инкрементного ключа необходимо выполнить две важные проверки:

  1. Если это не первая итерация, а
  2. текущий ключ минус (предыдущий ключ + 1) не равен 0.

Код: ( Демо )

$array = [
    1 => 'world',
    2 => 'is',
    3 => 'a',
    4 => 'wonderfull',
    6 => 'in',
    8 => 'our'
];

$prev = -1;
$i = 0;
foreach ($array as $key => $val) {
    if (++$prev && $key - $prev) { // $prev+1 != 0 AND $key-$prev+1 != 0
    // or if ($prev > -1 && $key - $prev > 1 ) {
        ++$i;  // increment index
    }
    $result[$i][] = $val;  // store the $val unconditionally
    $prev = $key;  // update $prev for next iteration
}
var_export($result);

Выход:

array (
  0 => 
  array (
    0 => 'world',
    1 => 'is',
    2 => 'a',
    3 => 'wonderfull',
  ),
  1 => 
  array (
    0 => 'in',
  ),
  2 => 
  array (
    0 => 'our',
  ),
)

Это решение генерирует индексированный массив, начиная с нуля, с моим вводом выборки и использует только один блок if. Напротив, решение AliveToDie генерирует массив с числовым ключом, начиная с 1, и использует два блока условий, содержащих избыточные строки кода.

0 голосов
/ 29 октября 2018

Вы можете использовать внутренний указатель массива для обхода массива.

<?php
$arr = Array(0=>"world",1=>"is",2=>"a",3=>"wonderfull",5=>"in",6=>"our");
print_r($arr);

$result = Array();
$lastkey;
while($word = current($arr))
{
    $key = key($arr);
    if(isset($lastkey) && $key == $lastkey + 1)
    {
        $result[count($result) - 1][] = $word;
    }
    else
    {
        $result[] = Array($word);
    }
    $lastkey = $key;
    next($arr);
}
print_r($result);
?>
...