【问题标题】:Split flat array into grouped subarrays containing values from consecutive key in the input array将平面数组拆分为包含输入数组中连续键值的分组子数组
【发布时间】:2018-10-29 04:58:09
【问题描述】:

我有一个来自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
        ) 
    )

【问题讨论】:

  • 如何确定间隙长度。它是变化的数字还是恒定的?
  • 这是一个不同的数字
  • 与其只描述您希望志愿者为您做的工作,请发布您发布的每个问题的自我解决的最佳尝试。不尝试自我解决将导致帮助盗版和志愿者滥用的周期性模式。

标签: php arrays key grouping


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    可以利用数组内部指针来遍历数组。

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

    【讨论】:

      【解决方案3】:

      这个任务是参考变量的完美候选。您无条件地将值推送到指定的“桶”中——在本例中为子数组。您只能有条件地更改存储桶在输出数组中的 where

      在确定是否应生成新的递增密钥时,需要进行两项重要检查:

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

      代码:(Demo)

      $nextKey = null;
      $result = [];
      foreach ($array as $key => $val) {
          if ($nextKey === null || $key !== $nextKey) {
              unset($ref);
              $result[] = &$ref;
          }
          $ref[] = $val;
          $nextKey = $key + 1;
      }
      var_export($result);
      

      此解决方案使用我的示例输入从零开始生成索引数组,并且仅使用一个 if 块。相比之下,AliveToDie 的解决方案会生成一个从 1 开始的数字键控数组,并使用两个包含冗余代码行的条件块。

      【讨论】:

        猜你喜欢
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-15
        • 2018-04-18
        • 1970-01-01
        相关资源
        最近更新 更多