【问题标题】:php array search with comparison [duplicate]带有比较的php数组搜索[重复]
【发布时间】:2017-09-24 03:32:30
【问题描述】:

我想在数组中搜索值,但准确的搜索值不存在。 示例:

$array = array (
    "A"  => 0,
    "B"  => 50,
    "C"  => 90,
    "D"  => 300,
    "E"  => 500
);

$searched_value = 80;

在这种情况下,我想获得 B。 我将使用的功能如下:

array_search($searched_value,$array,"<=")

我应该如何进行?

【问题讨论】:

  • 为什么是 B 而为什么不是 C?标准是什么
  • 这不是在寻找 最接近 匹配,因此可能重复的 abs 方法将不起作用。

标签: php arrays search


【解决方案1】:

过滤数组以仅包含符合条件的项目。

$target = 80;

$filtered = array_filter($array, function($x) use ($target) {
    return $x <= $target;
});

然后排序,除非它已经排序。

sort($filtered);

最大值

$value = end($filtered);
$key = key($filtered);

要对&gt;= 使用这种方法,只需在array_filter 回调中使用该运算符而不是&lt;=,并使用reset 而不是end 来获得first值而不是最后一个。


这对于在应用array_filter 之前已经排序的大型数组并不理想,因为array_filter 将迭代每个元素,即使它开始查找不符合条件的值。在这种情况下,最好只使用foreach,这样您就可以在找到目标后立即跳出循环。

$key = null;
$value = 0;

foreach ($array as $k => $v) {
    if ($v > $target) {
        break;
    }
    $key = $k;
    $value = $v;
}

var_dump($key, $value);

对于较小的数组或尚未排序的数组,这不会有太大的区别。

【讨论】:

    【解决方案2】:

    您可以使用array_map 从所有数组元素中减去您的值,然后使用array_filter 过滤大于0(零)的值,然后取最后一个条目。那应该是你的价值。

    类似这样的:

    $array = array ( ... );
    $searched_value = 80;
    
    function subtract($val) {
        return $val - $searched_value;
    }
    
    function ltzero($val) {
        return $val <= 0;
    }
    
    $new_arr = array_filter(array_map('subtract', $array), 'ltzero');
    
    // get last item or $new_arr
    

    【讨论】:

    • 或@Don't Panic 提供的更简单的版本:只需过滤掉大于您的搜索值的值 :)
    【解决方案3】:

    使用如果:-

    if(array_search($searched_value,$array)=="") 回声“未找到”; 别的 echo array_search($searched_value,$array);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多