我有一个数组:
Array
(
[1] => 25
[2] => 50
[3] => 25
)
我想进入:
Array
(
[1] => 50
[2] => 50
)
为此,我将中间值拆分为1到3.这是最简单的示例,其中拆分为50,50。我希望能够将15个元素的数组减少到6个元素。
有什么想法吗?
其他例子 [10,15,20,25]减少到两个元素:25(10 + 15),45(20 + 25) [10,10,10,10,11]减少到两个元素:25(10 + 10 +(10/2)),26((10/2)+ 10 + 11)
答案 0 :(得分:1)
在对Peter的解决方案进行额外的测试后,我注意到如果缩小到一个奇数,它没有得到我的预期。这是我想出的功能。它还会膨胀小于请求大小的数据集。
<?php
function reduceto($data,$r) {
$c = count($data);
// just enough data
if ($c == $r) return $data;
// not enough data
if ($r > $c) {
$x = ceil($r/$c);
$temp = array();
foreach ($data as $v) for($i = 0; $i < $x; $i++) $temp[] = $v;
$data = $temp;
$c = count($data);
}
// more data then needed
if ($c > $r) {
$temp = array();
foreach ($data as $v) for($i = 0; $i < $r; $i++) $temp[] = $v;
$data = array_map('array_sum',array_chunk($temp,$c));
}
foreach ($data as $k => $v) $data[$k] = $v / $r;
return $data;
}
?>
答案 1 :(得分:0)
您可以使用array_sum()对值进行求和,然后根据您在结果数组中要包含的元素数量,除以该总和并填充您希望与分割结果保持的每个元素。
(这里我假设您将使用第二个数组,但如果您愿意,可以取消不需要的数据。)
答案 2 :(得分:0)
这是我对你的问题的准备
<pre>
<?php
class Thingy
{
protected $store;
protected $universe;
public function __construct( array $data )
{
$this->store = $data;
$this->universe = array_sum( $data );
}
public function reduceTo( $size )
{
// Guard condition incase reduction size is too big
$storeSize = count( $this->store );
if ( $size >= $storeSize )
{
return $this->store;
}
// Odd number of elements must be handled differently
if ( $storeSize & 1 )
{
$chunked = array_chunk( $this->store, ceil( $storeSize / 2 ) );
$middleValue = array_pop( $chunked[0] );
$chunked = array_chunk( array_merge( $chunked[0], $chunked[1] ), floor( $storeSize / $size ) );
// Distribute odd-man-out amonst other values
foreach ( $chunked as &$chunk )
{
$chunk[] = $middleValue / $size;
}
} else {
$chunked = array_chunk( $this->store, floor( $storeSize / $size ) );
}
return array_map( 'array_sum', $chunked );
}
}
$tests = array(
array( 2, array( 25, 50, 25 ) )
, array( 2, array( 10, 15, 20, 25 ) )
, array( 2, array( 10, 10, 10, 10, 11 ) )
, array( 6, array_fill( 0, 15, 1 ) )
);
foreach( $tests as $test )
{
$t = new Thingy( $test[1] );
print_r( $t->reduceTo( $test[0] ) );
}
?>
</pre>