【问题标题】:php split array into smaller even arraysphp将数组拆分成更小的偶数数组
【发布时间】:2011-02-21 03:16:51
【问题描述】:

我有一个函数应该将我的数组拆分为更小的、均匀分布的数组,但是它似乎在复制我的数据。如果有人可以帮助我,那就太好了。

这是原始数组:

Array
(
    [0] => stdClass Object
        (
            [bid] => 42
            [name] => Ray White Mordialloc
            [imageurl] => sp_raywhite.gif
            [clickurl] => http://www.raywhite.com/
        )

    [1] => stdClass Object
        (
            [bid] => 48
            [name] => Beachside Osteo
            [imageurl] => sp_beachside.gif
            [clickurl] => http://www.beachsideosteo.com.au/
        )

    [2] => stdClass Object
        (
            [bid] => 53
            [name] => Carmotive
            [imageurl] => sp_carmotive.jpg
            [clickurl] => http://www.carmotive.com.au/
        )

    [3] => stdClass Object
        (
            [bid] => 51
            [name] => Richmond and Bennison
            [imageurl] => sp_richmond.jpg
            [clickurl] => http://www.richbenn.com.au/
        )

    [4] => stdClass Object
        (
            [bid] => 50
            [name] => Letec
            [imageurl] => sp_letec.jpg
            [clickurl] => www.letec.biz
        )

    [5] => stdClass Object
        (
            [bid] => 39
            [name] => Main Street Mordialloc
            [imageurl] => main street cafe.jpg
            [clickurl] => 
        )

    [6] => stdClass Object
        (
            [bid] => 40
            [name] => Ripponlea Mitsubishi
            [imageurl] => sp_mitsubishi.gif
            [clickurl] => 
        )

    [7] => stdClass Object
        (
            [bid] => 34
            [name] => Adrianos Pizza & Pasta
            [imageurl] => sp_adrian.gif
            [clickurl] => 
        )

    [8] => stdClass Object
        (
            [bid] => 59
            [name] => Pure Sport
            [imageurl] => sp_psport.jpg
            [clickurl] => http://www.puresport.com.au/
        )

    [9] => stdClass Object
        (
            [bid] => 33
            [name] => Two Brothers
            [imageurl] => sp_2brothers.gif
            [clickurl] => http://www.2brothers.com.au/
        )

    [10] => stdClass Object
        (
            [bid] => 52
            [name] => Mordialloc Travel and Cruise
            [imageurl] => sp_morditravel.jpg
            [clickurl] => http://www.yellowpages.com.au/vic/mordialloc/mordialloc-travel-cruise-13492525-listing.html
        )

    [11] => stdClass Object
        (
            [bid] => 57
            [name] => Southern Suburbs Physiotherapy Centre
            [imageurl] => sp_sspc.jpg
            [clickurl] => http://www.sspc.com.au
        )

    [12] => stdClass Object
        (
            [bid] => 54
            [name] => PPM Builders
            [imageurl] => sp_ppm.jpg
            [clickurl] => http://www.hotfrog.com.au/Companies/P-P-M-Builders
        )

    [13] => stdClass Object
        (
            [bid] => 36
            [name] => Big River
            [imageurl] => sp_bigriver.gif
            [clickurl] => 
        )

    [14] => stdClass Object
        (
            [bid] => 35
            [name] => Bendigo Bank Parkdale / Mentone East
            [imageurl] => sp_bendigo.gif
            [clickurl] => http://www.bendigobank.com.au
        )

    [15] => stdClass Object
        (
            [bid] => 56
            [name] => Logical Services
            [imageurl] => sp_logical.jpg
            [clickurl] => 
        )

    [16] => stdClass Object
        (
            [bid] => 58
            [name] => Dicount Lollie Shop
            [imageurl] => new dls logo.jpg
            [clickurl] => 
        )

    [17] => stdClass Object
        (
            [bid] => 46
            [name] => Patterson Securities
            [imageurl] => cmyk patersons_withtag.jpg
            [clickurl] => 
        )

    [18] => stdClass Object
        (
            [bid] => 44
            [name] => Mordialloc Personal Trainers
            [imageurl] => sp_mordipt.gif
            [clickurl] => #
        )

    [19] => stdClass Object
        (
            [bid] => 37
            [name] => Mordialloc Cellar Door
            [imageurl] => sp_cellardoor.gif
            [clickurl] => 
        )

    [20] => stdClass Object
        (
            [bid] => 41
            [name] => Print House Graphics
            [imageurl] => sp_printhouse.gif
            [clickurl] => 
        )

    [21] => stdClass Object
        (
            [bid] => 55
            [name] => 360South
            [imageurl] => sp_360.jpg
            [clickurl] => 
        )

    [22] => stdClass Object
        (
            [bid] => 43
            [name] => Systema
            [imageurl] => sp_systema.gif
            [clickurl] => 
        )

    [23] => stdClass Object
        (
            [bid] => 38
            [name] => Lowe Financial Group
            [imageurl] => sp_lowe.gif
            [clickurl] => http://lowefinancial.com/
        )

    [24] => stdClass Object
        (
            [bid] => 49
            [name] => Kim Reed Conveyancing
            [imageurl] => sp_kimreed.jpg
            [clickurl] => 
        )

    [25] => stdClass Object
        (
            [bid] => 45
            [name] => Mordialloc Sporting Club
            [imageurl] => msc logo.jpg
            [clickurl] => 
        )

)

这是用于拆分数组的 php 函数:

function split_array($array, $slices) { 

        $perGroup = floor(count($array) / $slices);
        $Remainder = count($array) % $slices ;
        $slicesArray = array();

        $i = 0;
        while( $i < $slices ) {
            $slicesArray[$i] = array_slice($array, $i * $perGroup, $perGroup);
            $i++;
        }

        if ( $i == $slices ) { 
            if ($Remainder > 0 && $Remainder < $slices) {

                $z = $i * $perGroup +1;
                $x = 0;
                while ($x < $Remainder) {

                    $slicesRemainderArray = array_slice($array, $z, $Remainder+$x);
                    $remainderItems = array_merge($slicesArray[$x],$slicesRemainderArray);
                    $slicesArray[$x] = $remainderItems;

                $x++;
                $z++;
                }
            }
        };

        return $slicesArray;
    }

这是拆分的结果(它以某种方式将原始数组中的项目复制到较小的数组中):

Array
(
    [0] => Array
        (
            [0] => stdClass Object
                (
                    [bid] => 57
                    [name] => Southern Suburbs Physiotherapy Centre
                    [imageurl] => sp_sspc.jpg
                    [clickurl] => http://www.sspc.com.au
                )

            [1] => stdClass Object
                (
                    [bid] => 35
                    [name] => Bendigo Bank Parkdale / Mentone East
                    [imageurl] => sp_bendigo.gif
                    [clickurl] => http://www.bendigobank.com.au
                )

            [2] => stdClass Object
                (
                    [bid] => 38
                    [name] => Lowe Financial Group
                    [imageurl] => sp_lowe.gif
                    [clickurl] => http://lowefinancial.com/
                )

            [3] => stdClass Object
                (
                    [bid] => 39
                    [name] => Main Street Mordialloc
                    [imageurl] => main street cafe.jpg
                    [clickurl] => 
                )

            [4] => stdClass Object
                (
                    [bid] => 48
                    [name] => Beachside Osteo
                    [imageurl] => sp_beachside.gif
                    [clickurl] => http://www.beachsideosteo.com.au/
                )

            [5] => stdClass Object
                (
                    [bid] => 33
                    [name] => Two Brothers
                    [imageurl] => sp_2brothers.gif
                    [clickurl] => http://www.2brothers.com.au/
                )

            [6] => stdClass Object
                (
                    [bid] => 40
                    [name] => Ripponlea Mitsubishi
                    [imageurl] => sp_mitsubishi.gif
                    [clickurl] => 
                )

        )

    [1] => Array
        (
            [0] => stdClass Object
                (
                    [bid] => 44
                    [name] => Mordialloc Personal Trainers
                    [imageurl] => sp_mordipt.gif
                    [clickurl] => #
                )

            [1] => stdClass Object
                (
                    [bid] => 41
                    [name] => Print House Graphics
                    [imageurl] => sp_printhouse.gif
                    [clickurl] => 
                )

            [2] => stdClass Object
                (
                    [bid] => 39
                    [name] => Main Street Mordialloc
                    [imageurl] => main street cafe.jpg
                    [clickurl] => 
                )

            [3] => stdClass Object
                (
                    [bid] => 48
                    [name] => Beachside Osteo
                    [imageurl] => sp_beachside.gif
                    [clickurl] => http://www.beachsideosteo.com.au/
                )

            [4] => stdClass Object
                (
                    [bid] => 33
                    [name] => Two Brothers
                    [imageurl] => sp_2brothers.gif
                    [clickurl] => http://www.2brothers.com.au/
                )

            [5] => stdClass Object
                (
                    [bid] => 40
                    [name] => Ripponlea Mitsubishi
                    [imageurl] => sp_mitsubishi.gif
                    [clickurl] => 
                )

        )

    [2] => Array
        (
            [0] => stdClass Object
                (
                    [bid] => 56
                    [name] => Logical Services
                    [imageurl] => sp_logical.jpg
                    [clickurl] => 
                )

            [1] => stdClass Object
                (
                    [bid] => 43
                    [name] => Systema
                    [imageurl] => sp_systema.gif
                    [clickurl] => 
                )

            [2] => stdClass Object
                (
                    [bid] => 48
                    [name] => Beachside Osteo
                    [imageurl] => sp_beachside.gif
                    [clickurl] => http://www.beachsideosteo.com.au/
                )

            [3] => stdClass Object
                (
                    [bid] => 33
                    [name] => Two Brothers
                    [imageurl] => sp_2brothers.gif
                    [clickurl] => http://www.2brothers.com.au/
                )

            [4] => stdClass Object
                (
                    [bid] => 40
                    [name] => Ripponlea Mitsubishi
                    [imageurl] => sp_mitsubishi.gif
                    [clickurl] => 
                )

        )

    [3] => Array
        (
            [0] => stdClass Object
                (
                    [bid] => 53
                    [name] => Carmotive
                    [imageurl] => sp_carmotive.jpg
                    [clickurl] => http://www.carmotive.com.au/
                )

            [1] => stdClass Object
                (
                    [bid] => 45
                    [name] => Mordialloc Sporting Club
                    [imageurl] => msc logo.jpg
                    [clickurl] => 
                )

            [2] => stdClass Object
                (
                    [bid] => 33
                    [name] => Two Brothers
                    [imageurl] => sp_2brothers.gif
                    [clickurl] => http://www.2brothers.com.au/
                )

            [3] => stdClass Object
                (
                    [bid] => 40
                    [name] => Ripponlea Mitsubishi
                    [imageurl] => sp_mitsubishi.gif
                    [clickurl] => 
                )

        )

    [4] => Array
        (
            [0] => stdClass Object
                (
                    [bid] => 59
                    [name] => Pure Sport
                    [imageurl] => sp_psport.jpg
                    [clickurl] => http://www.puresport.com.au/
                )

            [1] => stdClass Object
                (
                    [bid] => 54
                    [name] => PPM Builders
                    [imageurl] => sp_ppm.jpg
                    [clickurl] => http://www.hotfrog.com.au/Companies/P-P-M-Builders
                )

            [2] => stdClass Object
                (
                    [bid] => 40
                    [name] => Ripponlea Mitsubishi
                    [imageurl] => sp_mitsubishi.gif
                    [clickurl] => 
                )

        )

    [5] => Array
        (
            [0] => stdClass Object
                (
                    [bid] => 46
                    [name] => Patterson Securities
                    [imageurl] => cmyk patersons_withtag.jpg
                    [clickurl] => 
                )

            [1] => stdClass Object
                (
                    [bid] => 34
                    [name] => Adriano's Pizza & Pasta
                    [imageurl] => sp_adrian.gif
                    [clickurl] => #
                )

        )

    [6] => Array
        (
            [0] => stdClass Object
                (
                    [bid] => 55
                    [name] => 360South
                    [imageurl] => sp_360.jpg
                    [clickurl] => 
                )

            [1] => stdClass Object
                (
                    [bid] => 37
                    [name] => Mordialloc Cellar Door
                    [imageurl] => sp_cellardoor.gif
                    [clickurl] => 
                )

        )

    [7] => Array
        (
            [0] => stdClass Object
                (
                    [bid] => 49
                    [name] => Kim Reed Conveyancing
                    [imageurl] => sp_kimreed.jpg
                    [clickurl] => 
                )

            [1] => stdClass Object
                (
                    [bid] => 58
                    [name] => Dicount Lollie Shop
                    [imageurl] => new dls logo.jpg
                    [clickurl] => 
                )

        )

    [8] => Array
        (
            [0] => stdClass Object
                (
                    [bid] => 51
                    [name] => Richmond and Bennison
                    [imageurl] => sp_richmond.jpg
                    [clickurl] => http://www.richbenn.com.au/
                )

            [1] => stdClass Object
                (
                    [bid] => 52
                    [name] => Mordialloc Travel and Cruise
                    [imageurl] => sp_morditravel.jpg
                    [clickurl] => http://www.yellowpages.com.au/vic/mordialloc/mordialloc-travel-cruise-13492525-listing.html
                )

        )

    [9] => Array
        (
            [0] => stdClass Object
                (
                    [bid] => 50
                    [name] => Letec
                    [imageurl] => sp_letec.jpg
                    [clickurl] => www.letec.biz
                )

            [1] => stdClass Object
                (
                    [bid] => 36
                    [name] => Big River
                    [imageurl] => sp_bigriver.gif
                    [clickurl] => 
                )

        )

)

^^ 如您所见,在新创建的较小数组中存在原始数组的重复项。

我以为我可以使用多维删除重复功能删除重复项,但那不起作用。我猜我的问题出在 array_split 函数中。

有什么建议吗? :)

【问题讨论】:

    标签: php arrays split evenly


    【解决方案1】:

    在我看来,剩余物品的分布太复杂了。

    如果您知道缺少多少项目 ($Remainder),为什么不直接生成剩余的切片并使用 array_pop() 弹出项目直到它为空?

    顺便说一句,您也可以对整个数组使用该过程。

    【讨论】:

      【解决方案2】:

      编辑:array_chunk 就是这样做的。

      好吧,我不想调试,所以我写了一个带有array_reduce的版本:

      $pergroup = 2;
      $redfunc = function ($partial, $elem) use ($pergroup) {
          $groupCount = count($partial);
          if ($groupCount == 0 || count(end($partial)) == $pergroup)
              $partial[] = array($elem);
          else
              $partial[$groupCount-1][] = $elem;
      
          return $partial;
      };
      
      $arr = array(1,2,3,4,5);
      
      print_r(array_reduce($arr, $redfunc, array()));
      

      给予

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

      【讨论】:

      • 谢谢你,虽然我收到了这个错误: Parse error: syntax error, unexpected T_FUNCTION in testing.php on line 53 那行是 $redfunc = function($partial, $elem) use ($pergroup) {
      • 您没有使用 PHP 5.3.x 您可以将其替换为普通函数并将其名称作为字符串传递给 array_reduce。
      • 会尝试一下,看看我会怎么做:)
      【解决方案3】:

      array_chunk 就是这样做的。

      http://www.php.net/manual/en/function.array-chunk.php

      [只是让 Artefacto 答案的突出部分更加明确]

      【讨论】:

      • 当你只是想放一个链接/给一个提示,你可以在答案或问题下留下评论。仅链接的答案在 StackOverflow 上的价值很低。
      【解决方案4】:
      $sections = array_chunk(array('k', 'l', 'm', 'n', 'o'), 2);
      

      【讨论】:

        【解决方案5】:

        试试这个简单的用法。当它找到空字符串时,它将数组拆分为两个数组。一个从开始到空字符串索引。其他从空字符串索引到最后一个。
        注意:Emty 字符串不包含在两者中。它仅用于条件检查。

            $column[] = "id";
            $column[] = "name";
            $column[] = "email";
            $column[] = "password";
            $column[] = "";
            $column[] = "uid";
            $column[] = "uname";
            $column[] = "mname";
            $column[] = "lname";
            $column[] = "city";
            $column[] = "country";
            $column[] = "zip";
            $column[] = "cell";
            $column[] = "address";
            split_array($column);
        
        function split_array($column)
        {
        
            $total = count($column);
            $num = array_search('',$column);
        
            $split = $total - $num ;
            $outer_sql = array_slice( $column , - ($split) + 1);
            array_splice($column , $num);
        
            echo "<pre>";
            print_r($outer_sql);
            echo "</pre>";
            echo "<pre>";
            print_r($column);
            echo "</pre>";  
        
        }
        

        【讨论】:

          【解决方案6】:

          array_chunk 不会均匀地填充数组,除非元素的总数可以被您想要的块数整除;最后一个块可能比第一个小得多(例如,如果您有七个元素并分成三个块,您将得到包含三个、三个和一个元素的数组)。

          以下实现将尝试消除这种情况,以便数组大小更大,即使这是您所追求的,例如如果您有七个元素,您将获得包含三个、两个和两个元素的块数组。它仍然不均匀,但它更均匀。如果计数可以被列数整除,它会退回到使用array_chunk,因为这样会更快(特别是如果您有大型数组)。

          <?php
          function array_group($array, $num)                                                
          {                                                                           
              $num = (int) $num;                                                      
              if ($num < 1) {                                                         
                  throw new \InvalidArgumentException('At least one group must be returned.');
              }                                                                       
          
              $count = count($array);                                                
              if ($count && $count % $num === 0) {                                    
                  return array_chunk($array, $count / $num);                         
              }                                                                       
          
              $groups = [];                                                           
              $offset = 0;                                                            
              do {                                                                    
                  $length   = ceil(($count - $offset) / $num);                
                  $groups[] = array_slice($array, $offset, $length);                 
                  $offset   += $length;                                               
              } while (--$num);                                                       
          
              return $groups;                                                         
          } 
          
          print_r(array_chunk(array(1, 2, 3, 4, 5, 6, 7), 3));
          /* Produces
          Array
          (
              [0] => Array
                  (
                      [0] => 1
                      [1] => 2
                      [2] => 3
                  )
          
              [1] => Array
                  (
                      [0] => 4
                      [1] => 5
                      [2] => 6
                  )
          
              [2] => Array
                  (
                      [0] => 7
                  )
          
          ) */
          
          print_r(array_group(array(1, 2, 3, 4, 5, 6, 7), 3));
          /* Produces
          Array
          (
              [0] => Array
                  (
                      [0] => 1
                      [1] => 2
                      [2] => 3
                  )
          
              [1] => Array
                  (
                      [0] => 4
                      [1] => 5
                  )
          
              [2] => Array
                  (
                      [0] => 6
                      [1] => 7
                  )
          ) */
          

          【讨论】:

            【解决方案7】:

            将 php 数组分成两个相等的部分是一种简单的方法。 并且您可以使用 foreach easity 获取两个数组的所有元素和值

            list($firstarray, $secondarray) = array_chunk($vorstand_two_column, ceil(count($all_array_contents) / 2));  
            
            foreach($firstarray as $fa) {
            .... Code ....
            }
            
            foreach($secondarray as $sa) {
            .... Code ....
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-07-07
              • 1970-01-01
              • 2022-12-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多