【问题标题】:Split array into a specific number of chunks将数组拆分为特定数量的块
【发布时间】:2013-03-21 07:46:49
【问题描述】:

我知道array_chunk() 允许将数组拆分为多个块,但是块的数量会根据元素的数量而变化。我需要的是始终将数组拆分为特定数量的数组,例如 4 个数组。

以下代码将数组拆分为 3 个块,两个块每个包含 2 个元素,1 个块包含 1 个元素。我想要的是将数组始终拆分为 4 个块,无论数组具有多少总元素,但始终尝试像 array_chunck 函数一样将元素均匀地划分在块中。我怎样才能做到这一点?是否有任何 PHP 函数可以做到这一点?

$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));
print_r(array_chunk($input_array, 2, true));

谢谢。

【问题讨论】:

标签: php arrays split


【解决方案1】:

你可以试试

$input_array = array(
        'a',
        'b',
        'c',
        'd',
        'e'
);

print_r(partition($input_array, 4));

输出

Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [0] => c
        )

    [2] => Array
        (
            [0] => d
        )

    [3] => Array
        (
            [0] => e
        )

)

使用的功能

/**
 * 
 * @param Array $list
 * @param int $p
 * @return multitype:multitype:
 * @link http://www.php.net/manual/en/function.array-chunk.php#75022
 */
function partition(Array $list, $p) {
    $listlen = count($list);
    $partlen = floor($listlen / $p);
    $partrem = $listlen % $p;
    $partition = array();
    $mark = 0;
    for($px = 0; $px < $p; $px ++) {
        $incr = ($px < $partrem) ? $partlen + 1 : $partlen;
        $partition[$px] = array_slice($list, $mark, $incr);
        $mark += $incr;
    }
    return $partition;
}

【讨论】:

  • @Baba 非常好的解决方案。 :) 我注意到你的函数中有一个尾随的右括号。不幸的是,由于最小字符限制,我无法编辑此错误。仅供参考
  • 该死的,这很有用!一些 cmets 会很好地帮助了解发生了什么,但否则这真是太棒了!
【解决方案2】:

这里有这么多复杂的答案。我将发布我的简单解决方案:)

function splitMyArray(array $input_array, int $size, $preserve_keys = null): array
{
    $nr = (int)ceil(count($input_array) / $size);

    if ($nr > 0) {
        return array_chunk($input_array, $nr, $preserve_keys);
    }

    return $input_array;
}

用法:

$newArray = splitMyArray($my_array, 3);

更多详情在这里: https://zerowp.com/split-php-array-in-x-equal-number-of-elements/

【讨论】:

    【解决方案3】:

    将数组的大小除以您想要的块数,并将其作为每个块的大小。

    function array_chunks_fixed($input_array, $chunks=3 /*Default chunk size 3*/) {
        if (sizeof($input_array) > 0) {        
            return array_chunk($input_array, intval(ceil(sizeof($input_array) / $chunks)));
        }
    
        return array();
    }
    

    然后这样称呼它:

    array_chunks_fixed($myarray, 2); //override the default number of '3'
    

    【讨论】:

    • 谢谢。但是,如果我有一个包含 5 个元素的数组并且我想分成 4 个块,那么使用该代码会得到 5 个块而不是 4 个块。也许我总是可以合并最后两个数组?
    • 使用 ceil 而不是 intval - 你想确保你总是四舍五入。
    • 谢谢。使用 3 个块是可行的,但是当我尝试从一个包含 5 个元素的数组中获取 4 个块时,我总是得到 3 个块。我还尝试将 intval 更改为 ceil。
    • 5 个元素大的数组中的 4 个块的问题是 array_chunk(..) 的最后一个块保证与前面的块大小相同或更小。在这种情况下,您需要其中一个块比另一个块大。它可以通过检查结果的大小来完成,如果它大于 $chunks,则合并其中的两个块。
    【解决方案4】:

    这就是我写的很好用 print_r(array_divide($input,3));

    function array_divide($array, $segmentCount) {
        $dataCount = count($array);
        if ($dataCount == 0) return false;
        $segmentLimit = 1;
        //if($segmentCount > $segmentLimit)
          //  $segmentLimit = $segmentCount;
        $outputArray = array();
        $i = 0;
        while($dataCount >= $segmentLimit) {
    
            if( $segmentCount  == $i)
                $i = 0;
            if(!array_key_exists($i, $outputArray))
                $outputArray[$i] = array();
            $outputArray[$i][] =  array_splice($array,0,$segmentLimit)[0] ;
            $dataCount = count($array);
    
    
    
           $i++;
        }
        if($dataCount > 0) $outputArray[] = $array;
    
        return $outputArray;
    }
    

    【讨论】:

      【解决方案5】:

      另一个类似于@Baba 的partition() 函数的实现。

      // http://php.net/manual/en/function.array-slice.php#94138
      // split the given array into n number of pieces 
      function array_split($array, $pieces=2) 
      {   
          if ($pieces < 2) 
              return array($array); 
          $newCount = ceil(count($array)/$pieces); 
          $a = array_slice($array, 0, $newCount); 
          $b = array_split(array_slice($array, $newCount), $pieces-1); 
          return array_merge(array($a),$b); 
      } 
      
      // Examples: 
      $a = array(1,2,3,4,5,6,7,8,9,10); 
      array_split($a, 2);    // array(array(1,2,3,4,5), array(6,7,8,9,10)) 
      array_split($a, 3);    // array(array(1,2,3,4), array(5,6,7), array(8,9,10)) 
      array_split($a, 4);    // array(array(1,2,3), array(4,5,6), array(7,8), array(9,10)) 
      

      【讨论】:

        【解决方案6】:

        这应该可行:

        function getChunks(array $array, $chunks)
        {
        
          if (count($array) < $chunks)
          {
            return array_chunk($array, 1);
          }
        
          $new_array = array();
        
          for ($i = 0, $n = floor(count($array) / $chunks); $i < $chunks; ++$i)
          {
        
            $slice = $i == $chunks - 1 ? array_slice($array, $i * $n) : array_slice($array, $i * $n, $n);
        
            $new_array[] = $slice;
        
          }
        
          return $new_array;
        
        }
        
        $input_array = array('a', 'b', 'c', 'd', 'e');
        
        echo '<pre>' . print_r(getChunks($input_array, 4), TRUE) . '</pre>';
        

        【讨论】:

          【解决方案7】:

          如果有人正在寻找将超级数组划分为较少数量的单独数组的解决方案。

          $count = count($appArray); //$appArray contains all elements
          $repoCount = 3; //No. of parts to divide
          
          $n = floor($count/$repoCount);
          $rem = $count % $repoCount;
          $j=1;
          
          while($j <= $repoCount){
          
             ${"arr_" . $j} = array();
             $j++;
          
          }
          
          $j=0;
          $k=1;
          
          for($i=0; $i < $count; $i++){
          
              if($j < $n){
          
                  array_push(${"arr_" . $k}, $appArray[$i]);
                  $j++;
          
              }
              else if($k < $repoCount){
          
                  $j=0;
                  $k++;
                  --$i;
          
              }
              if($i >= ($count-$rem)){
          
                  $k=1;
          
                  for($j=0; $j < $rem; $j++, $i++, $k++){
          
                      array_push(${"arr_" . $k},$appArray[$i]);
          
                  }
                  break;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2022-01-06
            • 2012-06-27
            • 2013-06-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多