【问题标题】:Returning “n” elements from array disturbed evenly generates stderr从受干扰的数组中返回“n”个元素会生成标准错误
【发布时间】:2016-10-12 22:27:43
【问题描述】:

我有一个解决方案,它采用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

    【问题讨论】:

    • 听说过range()吗?
    • 您可以使用 php 的范围(如正确提示的 @PHPglue)让您的生活更轻松......
    • 似乎新的编码考试即将到来或类似。在今天之前,使用相同措辞的类似问题已经被问过两次......
    • 不能为每个“步长”($interval)使用一个固定的值,同时保证正确的输出长度。
    • 解释均匀分布是什么意思。 array_splice()?

    标签: php arrays algorithm


    【解决方案1】:

    你太早了。步数 ($interval) 应该是精确的,因为如果向上舍入,这些步数会使您太快到达数组的开头并导致负索引。

    所以只有当你使用结果索引时才四舍五入:

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

    【讨论】:

    • 您接受的解决方案并不总是返回具有所需元素数量的数组,而是更少。如果您在问题中提供的示例数组上运行它,输出数组将只有 8 个元素而不是 10 个。您确实需要从 $interval 中取出 round:这是错误的算术。
    • 是的,我明白了。你说的对。我选择作为解决方案的代码还有其他问题。
    【解决方案2】:

    您的问题源于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];
            }
    

    【讨论】:

    • 这样更好,因为它不会在每个循环中调用round。
    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多