【发布时间】:2019-06-29 07:01:56
【问题描述】:
我有一个代表折线图上点的值数组:
$temperatures = [23, 24, null, '', 25, '', '', null];
我使用的是 PHP4,但我认为它可以用任何语言回答。
数组只包含数字、空值和空字符串。
数字表示温度,空值表示仪器不工作,空字符串表示两者都没有(仪器工作,只是没有测量任何东西)。
必须(在大多数情况下)连接点,因为它是折线图。
我有一个变量$gap,它对应于每个点,并告诉这个点是否连接到下一个点。如果设置为true,则点不连接(否则为false)。例如,temperatures[0] 的 $gap 必须设置为 false,因为在 temperatures[0] 和 temperature[1](they are both valid temperatures). $gap fortemperatures[1]andtemperatures[2] 之间绘制的线必须为真,因为有空跟随。以此类推。
当有 null 时,$gap 绝对是true。对于数字和空字符串,它取决于:如果后面是 null,则 gap 为 true;如果后面跟着一个数字,gap 是假的。如果后面是空字符串,我们必须检查后面是 null 还是 number 并相应地应用前一句。如果后面只有空字符串,则 gap 为真。这是我的代码,运行速度太慢,但产生了正确的结果:
$limit = count($temperatures);
for ($i = 0; $i <= limit; $i++) {
$next_is_number = false;
if (is_null($temperatures[i]) {
$gap = true;
} else {
for ($y = $i + 1; $i <= limit; $i++) {
if (is_null($temperatures[$y]) {
break;
} elsif (is_numeric($temperatures[$y]) {
$next_is_number = true;
break;
}
}
if ($next_is_number) {
$gap = false;
} else {
$gap = true;
}
}
}
如何加快速度?
【问题讨论】:
-
空字符串实际上代表什么?仪器在工作,但没有收集到数据?是错误还是只是缺少信息?
-
您似乎每次都从当前位置(
$y = $i + 1)检查到列表末尾。您真的只想检查下一个条目是否为空白/null,而不是任何条目为空白或 null? -
我认为您不需要嵌套循环的第二个 forLoop。只需删除具有第二个循环的行及其各自的结束“}”并删除具有“break;”的那两行。并将 $y 替换为 $i+1 ,您的程序应该可以正常运行并且可能更快
-
@Ashish 很遗憾,需要循环。
-
@NigelRen 如果下一个是空白或空怎么办?
标签: php arrays performance loops line