如何压缩数组?

时间:2014-11-27 14:02:43

标签: php arrays

可以说,我有一个包含1000个值(整数)的数组。我需要从这个数组中得到一个带有f.e的数组。 400个值(数量可以更改,f.e。150等)。

所以我需要返回每个第2.5个数组值,即第1,第3,第6,第8,第11等等。

这有可能吗?

我不需要代码,我只需要一些方法,如何做。

编辑:

我的数组是高程数组(来自另一个带GPS坐标的数组)。我想绘制一个2D模型的高程。可以说,我的地图总是有400px宽度。 1px = 1个海拔高度。这就是为什么我需要每个第2.5个高程值......

像这样:

enter image description here

5 个答案:

答案 0 :(得分:2)

你不想要第2.5个。你实际上想要将集合划分为五个块,并从每个集合中获得第一个和第三个。

 0   1   2   3   4
 5   6   7   8   9
10  11  12  13  14

您需要第一列和第三列。

这是PHP,所以我们有基于0的数组。

我们可以使用模运算符%将其分成5个组。然后我们可以看到返回值是0(即它在第一列中)还是2(即它在第三列中)。

我将假设您的数组具有从0开始的数字键。

// PHP 5.6
$filtered = array_filter($array, function($value, $key) {
    $mod = $key % 5;

    return ($mod === 0) || ($mod === 2);
}, ARRAY_FILTER_USE_BOTH);

// pre-PHP 5.6
$filtered = array();
foreach ($array as $key => $value) {
  $mod = $key % 5;

  if (($mod === 0) || ($mod === 2)) {
    $filtered[$key] = $value;
  }
}

var_dump($filtered);

答案 1 :(得分:1)

如何使用modulo %运算符?

假设您要将1000转换为200个值,循环遍历数组中的所有项并保留计数器,如果计数器% 5 == 0然后将该值放入新数组,或者如果! = 0然后从数组中删除。我们使用模5,因为1000/200 = 5。

答案 2 :(得分:1)

以下是开始的方式。它不能确保输出中包含第一个和最后一个元素,并且可能还有其他一些故障。但是既然你提出了这个想法,那就去吧 - array_reduce

$a=[1,2,3,4,5,6,7,8,9,10,11,12]

$step = 2.5; 
$i = 0; 

$r = array_reduce($a, function($memo, $curr) use(&$i, $step) { 
  if($i === round($step * count($memo))) {
    $memo[] = $curr; 
  }
  $i++; 
  return $memo; 
}, []);

print_r($r);
/*
Array
(
    [0] => 1
    [1] => 4
    [2] => 6
    [3] => 9
    [4] => 11
)
*/

希望它有所帮助。

答案 3 :(得分:1)

这应该与你似乎正在寻找的东西非常接近。它将收集最接近(向下舍入)到浮点值的值。

$list = range(1,1000);
$targetSize = 300;
$new = array();

$step = count($list) / $targetSize;
$curStep = 0;
for( $i = 0; $i < count($list); $i++ ) {
  $curStep++;
  if( $curStep > $step ) {
    $new[] = $list[ floor($i) ];
    $curStep -= $step;
  }
}

答案 4 :(得分:1)

所以就是这样:

$arr  = range(1, 1387); // f.e.
$cnt  = 296;            // f.e.

$new  = array();

$max  = count($arr);
$step = $max / $cnt;

for ($i = 0; $i < $max; $i += $step) {
  $new[] = round($arr[(int)$i]);
}