【问题标题】:Split array into chunks of alternating sizes将数组拆分为大小交替的块
【发布时间】:2012-08-30 11:19:57
【问题描述】:

我有一个数组:

Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
    [6] => 6
    [7] => 7
    [8] => 8
    [9] => 9
)

我想将数组拆分为交替的块。 (尺寸 2 然后 3 然后 2 然后 3 等等)

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

    [1] => Array
        (
            [0] => 3
            [1] => 4
        )

    [2] => Array
        (
            [0] => 5
            [1] => 6
            [2] => 7
        )

    [3] => Array
        (
            [0] => 8
            [1] => 9
        )

)

【问题讨论】:

  • 您的示例显示 3 然后 2 然后 3、2 3 等,即它以 3 而不是文本中的 2 开头。
  • @dontomaso 无论哪种方式都可以。

标签: php arrays split chunks


【解决方案1】:

应该可以的:

$a = array(0 => 0,1 => 1,2 => 2,3 => 3,4 => 4, 5 => 5, 6 => 6,7 => 7,8 => 8,9 => 9);
$chunks = array();
$i=1;
while(count($a)){
    $chunks[] = array_splice($a, 0,(2+($i%2)),array());

    $i++;
}

echo "<pre>";
var_dump($chunks);

【讨论】:

  • 这个答案缺少教育解释。
【解决方案2】:

您可以使用array_splice 来拆分数组,但是您需要设置条件对吗?您想根据什么拆分它们?

您可以使用array_merge 将它们带回array 的数组中。

如果是您当前的代码,代码将是:

PHP 代码

<?php
    $array = array(0,1,2,3,4,5,6,7,8,9);
    $final = array(
        array_splice($array, 0, 3),
        array_splice($array, 1, 2),
        array_splice($array, 1, 2),
        array_splice($array, 1, 2),
    );
    print_r($final);
?>

输出

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

    [1] => Array
        (
            [0] => 4
            [1] => 5
        )

    [2] => Array
        (
            [0] => 6
            [1] => 7
        )

    [3] => Array
        (
            [0] => 8
            [1] => 9
        )

)

在这里提琴:http://codepad.org/JzxcZ2Q1

【讨论】:

  • 它们只需要按照与原始数组相同的顺序进行拆分,就像我给出的示例一样。你能举例说明我如何使用这些函数来做到这一点吗?
  • 完成了。查看示例和小提琴,为您提供相同的输出。 @Jleagle
  • @mickmackusa 很高兴这样做,并感谢您的提醒。一会儿会更新。 ?
  • 我整天都在敲 php 问题。我更喜欢引导研究人员访问包含正确、解释和高质量建议的页面。这样,我就依靠别人来维护自己的内容。这就是我经常吹口哨的原因。这绝不是对您的攻击,但您的帖子不是很好的内容。我很高兴您同意在不久的将来对其进行编辑。谢谢。 (我也有成千上万的帖子,而且很难全部维护——当我收到一个次优答案的通知时,我喜欢它,因为我只想向研究人员展示良好的编码实践。)
  • 在为 Stack Overflow 策划内容时,我从不根据年龄区分页面。我无法回答新问题,因为它们都是重复的。几天来,我一直在梳理 Stack Overflow,同时清理大量多余的 transpose 问题。这不是一个转置问题,但我在搜索时发现了它。 Stack Overflow 有太多的知识分散在太多的地方,研究人员很可能会错过真正的宝石。我认为我们,高级代表,需要专注于清理 SO,以便这个地方成为它被设计成的“研究人员的天堂”。
【解决方案3】:

array_splice() 的迭代调用似乎是一个不错的选择。这是 István Őri 答案的更简洁版本。从 5 中减去就不需要使用模运算符。

代码:(Demo)

$array = range(1, 10);

$chunks = [];
$chunkSize = 3;

while ($array) {
    $chunkSize = 5 - $chunkSize;
    $chunks[] = array_splice($array, 0, $chunkSize);
}
var_export($chunks);

这个 sn-p 在迭代时修改 $arrayarray_splice() 不断从数组的前面删除元素。最终数组将变为空,while() 条件将失败——打破循环。

【讨论】:

    【解决方案4】:

    你可以使用它,它不是最优雅的,但它会为你解决问题 - 你可以很好地修改它并进一步调整它以适应你的目的:

    <?php
    
    $originalArray = array(0,1,2,3,4,5,6,7,8,9);
    
    
    $counter=count($originalArray);
    $isTwo=true;
    $newArray=array();
    $arrElement=0;
    $i=0;
    while($i<$counter)
    {
        if($isTwo)
        {
            $newArray[$arrElement]= array();
            for($j=0; $j<2; $j++)
            {
                $newArray[$arrElement][$j]=$originalArray[$i+$j];
            }
            $i+=2;
            $isTwo=false;
            $arrElement++;
        }
        else
        {
            $newArray[$arrElement]= array();
            for($j=0; $j<3; $j++)
            {
                $newArray[$arrElement][$j]=$originalArray[$i+$j];
            }
            $i+=3;
            $isTwo=true;
            $arrElement++;
        }
    }
        var_dump($newArray);
    ?>
    

    输出:

    array(4) {
      [0]=>
      array(2) {
        [0]=>
        int(0)
        [1]=>
        int(1)
      }
      [1]=>
      array(3) {
        [0]=>
        int(2)
        [1]=>
        int(3)
        [2]=>
        int(4)
      }
      [2]=>
      array(2) {
        [0]=>
        int(5)
        [1]=>
        int(6)
      }
      [3]=>
      array(3) {
        [0]=>
        int(7)
        [1]=>
        int(8)
        [2]=>
        int(9)
      }
    }
    

    【讨论】:

      【解决方案5】:
      $tobechunked_arr = array(0,1,2,3,4,5,6,7,8,9);
      $chunk_size_arr = array(3,2,3,2);
      $j = 0;
      foreach($chunk_size_arr as $key => $val)
      {
          for($i = 0; $i < $val; $i++)
          {
              $result_arr[$key][] = $tobechunked_arr[$j];
              $j++;
          }
      }
      
      echo "<pre>";
      print_r($result_arr);
      

      【讨论】:

      • 这个纯代码答案不灵活。它要求开发者确切知道$tobechunked_arr中有多少元素;否则有破裂的风险。
      【解决方案6】:

      试试这个

      <?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 
      $myArray = array("abc","def","ghi","jkl","mno","pqr","stu","vwx","yz");
      $newArray = array_chunk($myArray, 2, false);
      // Now process the multidimensional array made from array_chunk()
      $i = 0;
      foreach ($newArray as $inner_array) {
          $i++;
          echo "<h2>Chunk $i</h2>";
          while (list($key, $value) = each($inner_array)) {    
              echo "$key: $value <br />"; 
          }
      }
      ?>
      

      输出

      块 1

      0: abc

      1: 定义

      块 2

      0: 吉

      1:jkl

      块 3

      0:mno

      1: pqr

      第 4 块

      0: 学生

      1: vwx

      第 5 块

      0: yz

      【讨论】:

      • 我需要它是 2 和 3 的块
      • 这只会把它分成2块
      • 试试这个 $myArray = array("abc","def","ghi","jkl","mno","pqr","stu","vwx","yz" ); $newArray = array_chunk($myArray, 2, false); // 现在处理由array_chunk() 生成的多维数组 $i = 0; foreach ($newArray as $inner_array) { if($i==2 || $i==3) { echo "

        Chunk $i

        "; while (list($key, $value) = each($inner_array)) { echo "$key: $value
        "; } } $i++; }
      猜你喜欢
      • 2018-10-22
      • 2020-01-14
      • 2020-09-16
      • 2017-04-02
      • 2013-11-06
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多