php获取两个数组键之间的子数组
在两个键之间获取数组子数组的最有效方法是什么 那么比如说,php获取两个数组键之间的子数组,php,arrays,Php,Arrays,在两个键之间获取数组子数组的最有效方法是什么 那么比如说, $arr=array(); $arr['2014-03-01']='something'; $arr['2014-03-03']='something'; $arr['2014-02-04']='something'; $arr['2014-03-05']='something'; $arr['2014-03-07']='something'; $arr['2014-03-09']='something'; $arr['2014-01-
$arr=array();
$arr['2014-03-01']='something';
$arr['2014-03-03']='something';
$arr['2014-02-04']='something';
$arr['2014-03-05']='something';
$arr['2014-03-07']='something';
$arr['2014-03-09']='something';
$arr['2014-01-04']='something';
$arr['2014-03-31']='something';
获取两个关键点之间的子阵列
i、 e.开始键:2014-02-04和结束键:2014-03-07应返回仅包含以下内容的数组:
$arr['2014-02-04']='something';
$arr['2014-03-05']='something';
$arr['2014-03-07']='something';
是否有一种快速有效的方法来执行此操作而不在整个阵列中循环
更新:我做了一个基准测试,结果如下:
$arr=array();
for ($i=1;$i<=1000000;$i++) {
$arr["$i"]=$i;
}
$time_start=microtime_float();
$start = '20000';
$end = '20010';
$offset = array_search($start, array_keys($arr));
$length = array_search($end, array_keys($arr)) - $offset + 1;
$output = array_slice($arr, $offset, $length);
print_r($output);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "TIME=$time\n";
echo "\n============\n";
$time_start=microtime_float();
$result = array();
$start = '20000';
$end = '20010';
foreach ($arr as $key => $value) {
if ($key >= $start && $key <= $end)
$result[$key] = $value;
}
print_r($output);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "TIME=$time\n";
exit;
因此,一个简单的循环似乎稍微快一点。如果我从阵列的更深处开始,优势就会增加。你也可以用break;一旦达到后一点。最有效的方法是使用循环
$result = array();
$start = '2014-02-04';
$end = '2014-03-07';
foreach ($arr as $key => $value) {
// your date format is string comparable, otherwise use strtotime to convert to unix timestamp.
if ($key >= $start && $key <= $end) {
$result[$key] = $value;
}
}
$result=array();
$start='2014-02-04';
$end='2014-03-07';
foreach($arr作为$key=>$value){
//您的日期格式是字符串可比的,否则使用strotime转换为unix时间戳。
如果($key>=$start&&$key最有效的方法是使用循环
$result = array();
$start = '2014-02-04';
$end = '2014-03-07';
foreach ($arr as $key => $value) {
// your date format is string comparable, otherwise use strtotime to convert to unix timestamp.
if ($key >= $start && $key <= $end) {
$result[$key] = $value;
}
}
$result=array();
$start='2014-02-04';
$end='2014-03-07';
foreach($arr作为$key=>$value){
//您的日期格式是字符串可比的,否则使用strotime转换为unix时间戳。
如果($key>=$start&&$key您可以尝试,并且:
输出:
array (size=5)
'2014-02-04' => string 'something' (length=9)
'2014-03-01' => string 'something' (length=9)
'2014-03-03' => string 'something' (length=9)
'2014-03-05' => string 'something' (length=9)
'2014-03-07' => string 'something' (length=9)
您可以尝试,并且:
输出:
array (size=5)
'2014-02-04' => string 'something' (length=9)
'2014-03-01' => string 'something' (length=9)
'2014-03-03' => string 'something' (length=9)
'2014-03-05' => string 'something' (length=9)
'2014-03-07' => string 'something' (length=9)
array_filter“迭代每个值”,因此不是首选项mm,除非提前对键进行排序,否则无法避免“迭代每个值”问题。键按上述方式排序。实际上,您并不是在尝试获取“两个键之间的子数组”!您试图筛选数据集,使其仅包含两个边界之间的值,这是一个不同的问题。此外,如果不在循环中逐个查看每个值,您将永远无法解决此问题。我将对答案进行基准测试并发布结果。数组_filter“迭代每个值”所以不是首选项嗯,除非提前对键进行排序,否则无法避免“迭代每个值”的问题。键按上述方式排序。实际上,您并不是在尝试获取“两个键之间的子数组”!您试图筛选数据集,使其仅包含两个边界之间的值,这是一个不同的问题。此外,如果不在循环中逐个查看每个值,您将永远无法解决此问题。我将对答案进行基准测试并发布结果。使用一个巨大的数组。是否要在不循环的情况下执行此操作?@Ray您将永远无法使用任何ar无循环的数组。@xdazz只在键可比较和排序的情况下工作。但不一定是一个通用的解决方案。@deceze op的日期格式可以作为字符串进行比较。并排序?你的意思是排序结果吗?@xdazz我的意思是,数组['f'=>'foo','d'=>'bar',z'=>'baz']
?您的解决方案不适用于此。但请注意,因为它适用于OP的情况。使用一个巨大的数组。无论如何,要在不循环的情况下执行此操作?@Ray您将永远无法在不循环的情况下使用任何数组。@xdazz只适用于键具有可比性和排序的情况。但不一定是通用解决方案。@deceze the OP's date格式可以作为字符串进行比较。然后进行排序?你是说对结果进行排序吗?@xdazz我的意思是,数组['f'=>'foo','d'=>'bar','z'=>'baz']
?你的解决方案无法使用它。不过请注意,因为它适用于OP的情况。此解决方案假定数组已排序。:)@是的。看看ksort
。我知道ksort。我怀疑它比一个简单的循环构造慢。只是出于好奇的问题-这个方法比简单的foreach快吗?我的意思是ksort,array\u slice,array\u search循环数组“在后台”无论如何会循环几次?这将循环一整批。此解决方案假定数组已排序。:)@是的。看看ksort
。我知道ksort。我怀疑它比一个简单的循环构造慢。只是出于好奇的问题-这个方法比简单的foreach快吗?我的意思是ksort,array\u slice,array\u search循环数组“在后台”几次吗?这会循环很多次。