Php 在数组中搜索最接近的键匹配

Php 在数组中搜索最接近的键匹配,php,arrays,algorithm,sorting,search,Php,Arrays,Algorithm,Sorting,Search,有没有更好/更优雅/更有效的方法 我有一个数组,我正在搜索一个匹配的值,或者是小于搜索值的最大值。希望这是有道理的 我当前的方法是一种蛮力尝试,对于一个小的数据集合来说很好,但是这个函数需要在一个大数组中运行很多次 $needle = '2013-04-04'; $haystack = array ( '2013-01-01' => 1, '2013-04-03' => 2,

有没有更好/更优雅/更有效的方法

我有一个数组,我正在搜索一个匹配的值,或者是小于搜索值的最大值。希望这是有道理的

我当前的方法是一种蛮力尝试,对于一个小的数据集合来说很好,但是这个函数需要在一个大数组中运行很多次

$needle = '2013-04-04';    

$haystack = array    (
                     '2013-01-01'   => 1,
                     '2013-04-03'   => 2,
                     '2013-04-05'   => 3,
                     '2013-07-23'   => 4,
                     '2013-09-12'   => 5,
                     '2013-10-18'   => 6,
                     '2013-11-01'   => 7
                     );

krsort($haystack);

foreach ($haystack as $k => $v)
    {
    $possibleMatch = $k;
    if ($needle >= $k) break;
    }

return $possibleMatch

提前感谢查看您的数据,您的数组似乎已排序。如果不是,就继续使用暴力。我认为在没有精确匹配的情况下,快速获得结果的方法是a(也称为二进制搜索或二分法)。伪代码:

在数组的中间取一个键。 如果该键低于搜索,请在以该键开头的子数组中搜索 如果该键优于搜索,请在以该键结尾的子数组中搜索 重复此操作,直到阵列大小为1

像这样:

  +----------------------------------------------------------------------------------------+
  |                                                                                        |
  +----------------------------------------------------------------------------------------+
  +----------------------------------------+ +---------------------------------------------+
  |                                        | |                                             |
  +----------------------------------------+ +---------------------------------------------+
  +------------------+ +-------------------+
  |                  | |                   |
  +------------------+ +-------------------+
                       +--------+ +--------+
                       |        | |        |
                       +--------+ +--------+
                       +---++---+
                       |   ||   |
                       +---++---+
                       +-+
                       | |
                       +-+

                      desired value

警告:我重复一遍,不要在谷歌图片上搜索对分。这很痛苦。

使用修改过的二进制搜索。这里有一个样本-;可轻松定制以满足您的需求

数组是否始终已排序?如果数组已排序或可以排序,请使用二进制搜索。不管是哪种方式,都要考虑找到小于或等于探测器的最大密钥。最初不是,但可以。它是从mysql数据库中检索的。@Gavin该数组是否用于其他目的,或者仅仅使用SQL查找正确的行是一个选项?该数组将被多次使用,因此我认为将所有数据存储在一个数组中并搜索该数组比多次访问数据库更有效。