【问题标题】:Closest value of an array below a reference value低于参考值的数组的最接近值
【发布时间】:2015-01-22 16:14:14
【问题描述】:

我有一个数组,其中包含带有相关“左”或“右”值的时间戳:

array (size=237)
  1421439428 => string 'left' (length=4)
  1421439411 => string 'right' (length=5)
  1421439392 => string 'left' (length=4)
  [here goes the example TS from below]
  1421439380 => string 'right' (length=5)
  1421439358 => string 'left' (length=4)
  1421439329 => string 'right' (length=5)
  1421439240 => string 'right' (length=5)
  1421439234 => string 'left' (length=4)

现在我想给出一个时间戳,例如1421439391(即是否在键中),我想知道最新的值是多少。在这种情况下“正确”。即使它更接近左值我也想知道下面的值!

这怎么可能(没有循环)?

带循环(基于 Alex W 链接的函数):

function closest($array, $number) {  
  foreach ($array as $key=>$val) {
    if ($key <= $number) return $val;
  }
  return end($array); // or return NULL;
}

【问题讨论】:

  • 可以使用循环。除非我们开始在迭代或嵌套循环中执行密集任务,否则循环的处理能力很便宜。特别是对于这个例子。你为什么害怕他们?
  • 究竟如何在没有循环的情况下扫描阵列?计算机基本上一次处理一位数据。一个数组是多位数据。没有循环,就无法扫描数组。即使您没有在代码中明确使用forforeach,也会有一个循环来迭代数组的值并应用您的测试。
  • 我知道 R(统计语言)中的解决方案可以解决问题。
  • 为什么会被否决?

标签: php arrays


【解决方案1】:

显然,为了尽可能提高效率,您首先要按时间戳对数组进行排序。然后,您需要编写自己的 closest 函数,例如 this one

既然你说你不想使用循环,这是你通常的做法,你必须为数组索引实现某种散列函数,以保持数组按时间戳值排序。然后,如果时间戳值不存在,则可以插入该值,然后转到下一个数组索引。

【讨论】:

  • 数组按时间戳排序。而且我有一个“最接近”的功能,但我不想要两个方向上最接近的,而是最接近我给定时间戳的。
  • 喜欢的最接近函数不允许像我这样的关联数组。
  • @Toni 最接近的函数应该适用于您的数组,因为它使用了 foreach。该函数也不会在两个方向上查看最近的值,但会返回您想要的值,因为它会检查大于或等于 $number 参数的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多