php将数组拆分成更小的偶数数组

时间:2010-05-18 22:14:18

标签: php arrays split evenly

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

这是原始数组:

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函数中。

有什么建议吗? :)

8 个答案:

答案 0 :(得分:8)

编辑:有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
        )

)

答案 1 :(得分:6)

$sections = array_chunk(array('k', 'l', 'm', 'n', 'o'), 2);

答案 2 :(得分:1)

在我看来,其余项目的分布过于复杂。

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

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

答案 3 :(得分:1)

function split_array(&$array, $slices) {
  $result = array();
  $l = count($array)-1;
  for ($i=0; $i<=$l; $i++) {
    if ($i == 0  || $i % $slices == 0) $tmp = array();
    $tmp[] = $array[$i];
    if ($i == $l || $i % $slices == 1) $result[] = $tmp; 
  }
  return $result;
}

答案 4 :(得分:1)

有array_chunk,就是这样。

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

[只是让Artefacto答案的显着部分更明确]

答案 5 :(得分:1)

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
        )
) */

答案 6 :(得分:0)

尝试这个简单的用法。当它找到空字符串时,它会将数组拆分为两个数组。一个从开始到空字符串索引。其他从空字符串索引到最后一个。
注意:两者都不包含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>";  

}

答案 7 :(得分:0)

将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 ....
}