将一个数组拆分为N个数组,所有的子数组的数量相差不超过1

作者:enenba | 发表于:2012-03-20 11:16 | 分类:php源码

想把$array(10个元素) 拆为4个子数组,其中数量为:3 3 2 2
如果使用PHP函数 array_chunk()只会生成 3 3 3 1      。如:

$rr = get_array($array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 4);
printf("<p>get_array输出数据为:</p><pre>%s</pre>\n", var_export($rr , true));

output:

array_chunk()输出数据为:

array (
  0 => 
  array (
    0 => 1,
    1 => 2,
    2 => 3,
  ),
  1 => 
  array (
    0 => 4,
    1 => 5,
    2 => 6,
  ),
  2 => 
  array (
    0 => 7,
    1 => 8,
    2 => 9,
  ),
  3 => 
  array (
    0 => 10,
  ),
)

 不符合要求

所以只能自写函数。

我同学写的:

/**
 * 将一个数组拆分为N个数组,所有的子数组的数量相差不超过1
 * $array array 要拆分的数组
 * $cum_nums ini c拆分成几个数组
 */
function get_array($array = null, $cum_nums) {
	$n = count($array); //数组的长度
	$m = intval($n / $cum_nums); //拆分后的每个一维数组中最短的数组个数
	$m_m = $n % $cum_nums; //除去刚好合适的,还剩余多少个数组
	for($i = 0;$i < $cum_nums;$i++) {
		if ($m_m > 0) {
			$k = 1;
		} else {
			$k = 0;
		} 
		$m_m--;
		for($j = 0;$j < ($m + $k);$j++) {
			foreach($array as $key => $value) {
				${array_.$i}[] = $value;
				unset($array[$key]);
				break;
			} 
		} 
		$array_array[] = ${array_.$i};
	} 
	return $array_array;
} 

$rr = get_array($array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 4);
printf("<p>get_array输出数据为:</p><pre>%s</pre>\n", var_export($rr , true));

ouput:

get_array输出数据为:

array (
  0 => 
  array (
    0 => 1,
    1 => 2,
    2 => 3,
  ),
  1 => 
  array (
    0 => 4,
    1 => 5,
    2 => 6,
  ),
  2 => 
  array (
    0 => 7,
    1 => 8,
  ),
  3 => 
  array (
    0 => 9,
    1 => 10,
  ),
)
功能已经成功实现

 

今天突然看到了php官网,还有更好的,一个循环就实现了

 

/**
 * 将二维数组拆分为N个数组,所有的子数组的数量相差不超过1 (PHP官网版)
 * $list array 要拆分的数组
 * $p ini c拆分成几个数组
 */
function partition( $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;
}

$rr = partition( $array, 4 );
printf("<p>partition()输出数据为:</p><pre>%s</pre>\n",var_export( $rr ,TRUE));

output:

partition()输出数据为:

array (
  0 => 
  array (
    0 => 1,
    1 => 2,
    2 => 3,
  ),
  1 => 
  array (
    0 => 4,
    1 => 5,
    2 => 6,
  ),
  2 => 
  array (
    0 => 7,
    1 => 8,
  ),
  3 => 
  array (
    0 => 9,
    1 => 10,
  ),
)

end

上一篇: HTML标签嵌套规则   |   下一篇:一个很好用的zip解压类» 标签: php源码 php函数 php函数库

评论: