我有一个解决方案,m-element array
返回n-element array
均匀分布。但是对于 m 的某些值,它会生成stderr
。
例如,如果数组将包含15个元素,则stderr
将为:
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];
答案 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];
}