按关键间隔的大块数组

时间:2018-10-29 04:58:09

标签: php array-difference

我有一个来自array_diff函数的数组,如下所示:

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

如您所见,键#3和#5之间有空隙(即没有键#4)。 如何将数组分成两部分,如果有更多的空白,可能还要更多? 预期的输出将是:

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

3 个答案:

答案 0 :(得分:5)

您可以使用old_keynew_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

答案 1 :(得分:1)

您可以使用数组内部指针遍历数组。

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

答案 2 :(得分:0)

您尚未收到完善的/经过充分考虑的解决方案,因此我会提供。

在确定是否应生成新的增量密钥时,有两项重要检查:

  1. 如果不是第一次迭代,则
  2. 当前键减(前一个键+ 1)不等于0。

代码:(Demo

$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开始的数字键数组,并使用两个包含冗余代码行的条件块。