从数组中返回的“n”元素均匀地生成stderr

时间:2016-10-12 22:27:44

标签: php arrays algorithm

我有一个解决方案,m-element array返回n-element array均匀分布。但是对于 m 的某些值,它会生成stderr

例如,如果数组将包含15个元素,则stderr将为:

  

  • PHP注意:未定义的偏移量:-3
  •   
  • PHP注意:未定义的偏移量:-1
  • class SpredArrayClass
    {
    
    var $array = [1,2,3,4,5,6,7,8,9,9,10,11,12,13,14,15];
    
    function spreadOutArray(array $array = [], $targetOutputLength = 10) {
    
        $array = $this->array;
    
        $originalArrayLength = count($array);
    
        if ($originalArrayLength == 0) {
            return false;
        }
    
        if ($originalArrayLength <= $targetOutputLength) {
            return $array;
        }
    
        $output = [];
        $interval = round($originalArrayLength / $targetOutputLength);
        for ($index = $originalArrayLength - 1; count($output) < $targetOutputLength; $index -= $interval) {
            $output[] = $array[$index];
        }
    
        return array_reverse($output);
        }
    }
    

    问题似乎出在这一部分:

    $output = [];
    $interval = round($originalArrayLength / $targetOutputLength);
    for ($index = $originalArrayLength - 1; count($output) < $targetOutputLength; $index -= $interval) {
        $output[] = $array[$index];
    }
    

    Undefinded offset stderr出现在此行:$output[] = $array[$index];

    代码执行的

    演示http://ideone.com/UrF9UK

    2 个答案:

    答案 0 :(得分:1)

    你太早了。步骤($ interval)应该是准确的,因为如果舍入是向上的,那么这些步骤将使您在数组的开头过快并导致负索引。

    因此,只有在使用结果索引时才进行循环:

    $interval = $originalArrayLength / $targetOutputLength;
    for ($index = $originalArrayLength - 1; count($output) < $targetOutputLength; $index -= $interval) {
        $output[] = $array[round($index)];
    }
    

    答案 1 :(得分:0)

      

    您的问题源于for循环中的条件。   将其更改为:

            $output = [];
            $interval = round($originalArrayLength / $targetOutputLength);
    
            // JUST KEEP LOOPING & PUSHING TILL SO LONG AS $index IS GREATER THAN 0;
            for($index = $originalArrayLength - 1; $index>=0; $index -= $interval) {
                $output[] = $array[$index];
            }