PHP 按键而不是按索引切片范围
PHP slice range by keys not by index
我有一个如下所示的数组:
$array = [
1000 => 'something',
2000 => 'something',
10000 => 'something',
20000 => 'something',
300000 => 'something',
];
假设我想获得 2000
和 20000
之间的间隔。我需要循环还是有更好的方法?
它不是索引,所以我不能在这种情况下使用切片。
我所希望的
我可以自己用一个循环来做这个,但希望有更聪明的东西。
$range = getRange(2000, 20000, $array);
print_r($range);
输出
$range = [
2000 => 'something',
10000 => 'something',
20000 => 'something',
];
function getRange($start,$end, $array){
$dataArray= array();
foreach($array as $key=>$value){
if($key>=$start && $key<=$end){
$dataArray[$key]= $value;
}
}
return $dataArray;
}
您将需要遍历数组并手动执行。即使有任何内置函数会迭代结果。简而言之,您将始终需要遍历数据集,并且您将始终具有 O(N) 的复杂性。
array_splice
是解决这个问题的方法。但是 array_splice
的问题是密钥永远不会被保留。查看此解决方案 array_splice preserving keys
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
}
我有一个如下所示的数组:
$array = [
1000 => 'something',
2000 => 'something',
10000 => 'something',
20000 => 'something',
300000 => 'something',
];
假设我想获得 2000
和 20000
之间的间隔。我需要循环还是有更好的方法?
它不是索引,所以我不能在这种情况下使用切片。
我所希望的
我可以自己用一个循环来做这个,但希望有更聪明的东西。
$range = getRange(2000, 20000, $array);
print_r($range);
输出
$range = [
2000 => 'something',
10000 => 'something',
20000 => 'something',
];
function getRange($start,$end, $array){
$dataArray= array();
foreach($array as $key=>$value){
if($key>=$start && $key<=$end){
$dataArray[$key]= $value;
}
}
return $dataArray;
}
您将需要遍历数组并手动执行。即使有任何内置函数会迭代结果。简而言之,您将始终需要遍历数据集,并且您将始终具有 O(N) 的复杂性。
array_splice
是解决这个问题的方法。但是 array_splice
的问题是密钥永远不会被保留。查看此解决方案 array_splice preserving keys
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
}