【问题标题】:PHP slice range by keys not by indexPHP按键切片范围而不是按索引
【发布时间】:2020-02-03 09:15:04
【问题描述】:

我有一个如下所示的数组:

$array = [
  1000 => 'something',
  2000 => 'something',
  10000 => 'something',
  20000 => 'something',
  300000 => 'something',
];

假设我想得到200020000 之间的间隔。我需要循环还是有更好的方法?

它不是索引,所以在这种情况下我不能使用切片。

我的期望

我可以自己用一个循环来做这件事,但希望有更聪明的方法。

$range = getRange(2000, 20000, $array);
print_r($range);

输出

$range = [
  2000 => 'something',
  10000 => 'something',
  20000 => 'something',
];

【问题讨论】:

  • 您只想获取值吗?
  • @OsmanOmar 不,一个数组,就像上面的输出一样。
  • array_filter 可以根据值或键进行过滤……
  • 循环是处理它的正确方法。您可以按照建议使用任何像 array_filter 这样的包装器,但它也会循环。所以你可以说使用包装器很优雅但并不聪明。

标签: php arrays range intervals


【解决方案1】:

array_filter 可以根据值进行过滤键...

function getRange($min, $max, $array) {
  return array_filter($array, function($key) use ($min, $max) {
    return $key >= $min && $key <= $max;
  }, ARRAY_FILTER_USE_KEY ); // flag to pass the key into the callback function
}

【讨论】:

    【解决方案2】:
    function getRange($start,$end, $array){
      $dataArray= array();
      foreach($array as $key=>$value){
    
        if($key>=$start && $key<=$end){
           $dataArray[$key]= $value;
         }
      }
     return $dataArray; 
    }
    

    您需要遍历数组并手动完成。即使有任何内置函数会迭代结果。简而言之,您将始终需要遍历数据集,并且您将始终具有 O(N) 的复杂度。

    【讨论】:

    • 我最终使用了来自@04FS 的解决方案和array_filter。它不需要迭代,即使 PHP 在内部进行迭代。
    • 没问题,array_filter在后端进行迭代
    【解决方案3】:

    array_splice 是解决此问题的方法。但是array_splice 的问题是永远不会保留密钥。查看此解决方案array_splice preserving keys

    【讨论】:

    • 如果您阅读有关 array_splice 的文档,则第 4 个参数不是布尔值。
    • 即使你把true 放在第四个参数中,密钥仍然不会被保留。我刚试过。
    • 啊,我的立场是正确的。我在想array_slice。使用array_slice 可以使用第四个参数保留键。
    • 哦,这就是为什么:D
    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2017-05-17
    • 2017-12-25
    • 2015-02-18
    • 2013-05-17
    • 1970-01-01
    相关资源
    最近更新 更多