Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php获取两个数组键之间的子数组_Php_Arrays - Fatal编程技术网

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循环数组“在后台”几次吗?这会循环很多次。