【问题标题】:PHP Array Filter on KEYS that pass a certain test通过特定测试的 KEYS 上的 PHP 数组过滤器
【发布时间】:2014-02-04 19:21:32
【问题描述】:

我有一个关联的 PHP 数组,我想生成一个通过特定测试的键列表。例如

 $myArray = ('28'=>0.01,'51'=>-0.1,'48'=>0.4,'53'=>-0.3);

我想以与过滤值相同的方式过滤键。因此,如果我过滤“返回大于 0.2 的元素”上的值将是

 print_r(array_filter($myArray,"biggerThanFilter");

 function biggerThanFilter($v){
       return $v>0.2;
 }

但是我如何将过滤器应用于显示“keyValueIsBiggerThan50”的键

比如这样的

print_r(array_KEY_filter($myArray,"keyValueIsBiggerThan50");

function keyValueIsBiggerThan50($key){
         return $key*1>50;
}

【问题讨论】:

  • 您只需要获取键,而不需要值吗?
  • @sigy - 是的,我看到(+1)和 +1 给回答这个问题的人。但我的问题更清楚 - 那篇文章中的问题更多的是匹配而不是通过测试。

标签: php arrays filter key


【解决方案1】:

我个人会遍历 array_keys 并取消设置:

function array_filter_keys($array, callable $fn)
  foreach (array_keys($array) as $key) {
    if (!$fn($key)) unset($array[$key])
  }
  return $array;
}

$filtered_array = array_filter_keys($array, function($key) { return $key > 50 });

假设 PHP >= 5.4

【讨论】:

  • 谢谢 - callable 是我一直在寻找的,因为我可以使用与 byValue 函数具有相似语法的函数。谢谢。
【解决方案2】:
function keyValueIsBiggerThan50 ($myArray) {
    $newArray = array();
    foreach($myArray as $key => $value){
        if($key * 1 > 50){
            $newArray[$key] = $value
        }
    }

    return $newArray;
}

像这样使用

print_r(keyValueIsBiggerThan50 ($myArray));

您是在寻找这种特殊情况还是一般情况?

【讨论】:

  • 这是我所追求的更通用的回调,但我喜欢你的回答,在你发帖之前我几乎没有机会买咖啡......
【解决方案3】:

对于 PHP 5.6+ my answer to a similar question 也适用于这个:使用 ARRAY_FILTER_USE_KEY

<?php
$myArray  = ['28' => 0.01, '51' => -0.1, '48' => 0.4, '53' => -0.3];
$filtered = array_filter(
    $myArray,
    function ($key) {
        return $key > 50;
    },
    ARRAY_FILTER_USE_KEY
);
?>

【讨论】:

    【解决方案4】:

    对于 PHP

    使用 PHP 5.5.9,我使用以下方法从数组中删除数字键元素:

     $res = array_diff_ukey($res, array(0), function ($a,$b){ return is_string($a); });
    

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 2020-09-19
      • 2013-07-02
      • 2017-04-10
      • 2012-02-06
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 2011-11-12
      相关资源
      最近更新 更多