php在范围中取值并使和为100

<?php
	$n = array(
		'0' => '1.1-4.6',
		'1' => '1.2-33.7',
		'2' => '1.3',
		'3' => '1.4-30',
		'4' => '15-44',
		'5' => '1.1-4.6',
		'6' => '1.2-33.7',
		'7' => '1.3',
		'8' => '1.4-43.9',
		'9' => '9.5-44',
	);
	$nn = check_zifu($n);
	for ($ii=0; $ii < count($nn); $ii++) { 
		if (count($nn[$ii]) > 1) {		//判断是否是范围,若不是,左边界值和右边界值相同
			$nnn[$ii]['min'] = ceil($nn[$ii][0]); 
			$nnn[$ii]['max'] = floor($nn[$ii][1]);
		}else{
			$nnn[$ii]['min'] = $nn[$ii][0];
			$nnn[$ii]['max'] = $nn[$ii][0];
		}
	}
	$nnnn = getNum($nnn);
	echo "<pre>";
	print_r($nnnn);

function check_zifu($a){
	$c = array();
	for ($i=0; $i < count($a); $i++) { 
		$r = strpos($a[$i],'-');
		if($r == ''||$r == false||$r == null){
			$r = strpos($a[$i],'~');
			if($r == ''||$r == false||$r == null){
				$c[$i][0] = $a[$i];
			}else{
				$b = explode('~', $a[$i]);
				$c[$i] = $b;
			}
		}else{
			$b = explode('-', $a[$i]);
			$c[$i] = $b;
		}
	}
	
	return $c;
}

function getNum($arr){
	for ($i=0; $i < count($arr); $i++) { 
		$c['min'][$i] = $arr[$i]['min'];
		$c['max'][$i] = $arr[$i]['max'];
	}
	$min_sum = array_sum($c['min']);		//计算左边界值之和
	$max_sum = array_sum($c['max']);		//计算右边界值之和
	if($min_sum < 100 && $max_sum > 100){	//若左边界值和大于100或右边界值和小于100,不成立
		for ($iii=0; $iii < count($c['min']); $iii++) { 	//从第一位左边界值开始加一
			$max = $c['max'][$iii];
			while ($c['min'][$iii]+1 <= $max) {				//判断是否超出右边界值
				$c['min'][$iii] = $c['min'][$iii]+1;
				if (array_sum($c['min']) == 100) {
					return $c['min'];
					break;
				}else if (array_sum($c['min']) > 100) {
					$c['min'][$iii] = $c['min'][$iii] - (array_sum($c['min']) - 100);
					return $c['min'];
					break;
				}
			}
		}
	}else if($min_sum == 100){		//若左边界值和为100
		for ($ii=0; $ii < count($c['min']); $ii++) { 
			$n[$ii] = $c['min'][$ii];
		}
		return $c['min'];
	}else if($max_sum == 100){		//若右边界值和为100
		for ($iiii=0; $iiii < count($c['max']); $iiii++) { 
			$n[$iiii] = $c['max'][$iiii];
		}
		return $c['min'];
	}else{
		echo 'error';
	}
}
?>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值