【问题标题】:PHP - Split an array into chunks based on its contentPHP - 根据其内容将数组拆分为块
【发布时间】:2017-05-15 20:57:16
【问题描述】:

我有一个 php 数组,我想使用循环将其拆分成更小的块。

一旦具有相同值的所有元素都被推入块中,我想使用该块做某事,然后继续循环并设置下一个块,直到原始 $array 的所有内容都已被使用。

public function adjust($array){ 
  // $array = [1, 1, 2, 2, 8, 8, 8, 9, 20]

  $chunk = array()

  for ($i = 0; $i < sizeof($array); $i++){
   // code here
   // result should be $chunk = [1, 1] 
   // use $chunk for something, reset its contents, 
   // continue loop until chunk is [2, 2],
   // rinse and repeat
 }    
}

我不需要循环,我只需要能够将$array 分割成 5 个$chunks(对于这个特定示例),以便能够处理数据。

没有一堆 if/else 子句,有没有更简单的方法来解决这个问题?

【问题讨论】:

  • 你想要这样的东西吗? [[1, 1], [2, 2], [8, 8, 8], [9], [20]]
  • 不,没必要。基本上,底部的答案是好的,但理想情况下我不想处理循环外的最后一块。谢谢。
  • 我认为使用一些库更容易。你用过 Laravel 和它的集合吗?我认为它很棒!你可以在外部和 Laravel/Lumen 使用这个项目 github.com/tightenco/collect 和你仍然使用所有 laravel 文档!
  • 我会调查一下,谢谢。

标签: php arrays


【解决方案1】:

array_count_values 更可能是您想要的。

$array = [1, 1, 2, 2, 8, 8, 8, 9, 20];
foreach (array_count_values($array) as $val => $count) {
    $chunk = array_fill(0, $count, $val); // contains [1, 1], [2, 2], etc.
}

【讨论】:

    【解决方案2】:

    $chunk 初始化为包含第一个元素的数组。然后循环遍历数组的其余部分,将当前元素与$chunk 中的元素进行比较。如果不同,请处理$chunk 并重置它。

    $chunk = array[$array[0]];
    for ($i = 1; $i < count($array); $i++) {
        if ($array[$i] != $chunk[0]) {
            // use $chunk for something
            $chunk = array($array[$i]);
        } else {
            $chunk[] = $array[$i];
        }
    }
    // process the last $chunk here when loop is done
    

    【讨论】:

      【解决方案3】:

      这可以在没有任何条件且无需与array_count_values() 预先分组的情况下完成。不需要迭代函数调用。只需将每个值用作临时分组键,因为您将每个值推送到它们自己的专用子数组中。即使重复值不是连续的,此技术也会对值进行分组。如果您想删除临时密钥,只需致电array_values()

      语言构造循环:(Demo)

      $result = [];
      foreach ($array as $value) {
          $result[$value][] = $value;
      }
      var_export(array_values($result));
      

      函数循环:(Demo)

      var_export(
          array_values(
              array_reduce(
                  $array,
                  function($result, $value) {
                      $result[$value][] = $value;
                      return $result;
                  },
                  []
              )
          )
      );
      

      两者都输出以下数据结构:

      [[1, 1], [2, 2], [8, 8, 8], [9], [20]]
      

      【讨论】:

        猜你喜欢
        • 2016-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-04
        • 2013-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多