Veri Dizisi PHP yumuşatma

3 Cevap php

Ben bir dizi var:

Array
(
    [1] => 25
    [2] => 50
    [3] => 25
)

Ben içine yapmak istiyorum:

Array
(
    [1] => 50
    [2] => 50
)

Bunun için ben 1 ve 3 arasında orta değerini bölünmüş. Bölünmüş 50,50 olduğu bu, basit bir örnektir. Ben 6 unsurla bir 15 eleman dizi almaya muktedir istiyorum.

Herhangi bir fikir?

Additional Examples [10, 15, 20, 25] Reduced to two elements: 25(10 + 15),45(20 + 25) [10, 10, 10, 10, 11] Reduced to two elements: 25(10 + 10 + (10/2)),26((10/2) + 10 + 11)

3 Cevap

Peter çözüm üzerinde ilave testler yaptıktan sonra, ben boyutuna azaltmak bir tek sayı ise beklediğim beni alamadım fark ettim. İşte ben ile geldi fonksiyonudur. Ayrıca istenen boyutta küçük sonra veri setleri şişirir.

   <?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;
        }
    ?>

Sen array_sum kullanarak değerleri toplamı () ve ardından, size çıkan dizi olmasını istediğiniz unsurların sayısına bağlı olarak, o toplamı bölmek ve size bölünme sonucu ile tutmak istediğiniz her eleman doldurabilir.

(Burada ikinci bir dizi kullanacağız varsayarak yaşıyorum, ama bunu bu şekilde tercih eğer gereksiz unset olabilir).

İşte konuyla benim bıçak bulunuyor

<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>