我正在尝试从值大于某个整数的关联数组中获取特定范围的值。所以有问题的数组是这样的(当然这只是原始数组的一小部分,最少有4000行)
"series" : [
{ "Timestamp" :1383921425,"close" :5.4500,"high" :5.4500,"low" :5.4500,"open" :5.4500,"volume" :0 }
, { "Timestamp" :1383921849,"close" :5.5000,"high" :5.5000,"low" :5.5000,"open" :5.5000,"volume" :3000 }
, { "Timestamp" :1383922360,"close" :5.5300,"high" :5.5300,"low" :5.5300,"open" :5.5300,"volume" :3200 }
, { "Timestamp" :1383922507,"close" :5.4700,"high" :5.4700,"low" :5.4700,"open" :5.4700,"volume" :200 }
, { "Timestamp" :1383923037,"close" :5.5000,"high" :5.5000,"low" :5.5000,"open" :5.5000,"volume" :500 }
, { "Timestamp" :1383923297,"close" :5.5000,"high" :5.5000,"low" :5.5000,"open" :5.5000,"volume" :0 }
, { "Timestamp" :1383923891,"close" :5.5400,"high" :5.5400,"low" :5.5300,"open" :5.5400,"volume" :6000 }
, { "Timestamp" :1383924237,"close" :5.5400,"high" :5.5400,"low" :5.5400,"open" :5.5400,"volume" :0 }
, { "Timestamp" :1383924468,"close" :5.4400,"high" :5.4400,"low" :5.4400,"open" :5.4400,"volume" :2600 }
, { "Timestamp" :1383925088,"close" :5.4500,"high" :5.4500,"low" :5.4500,"open" :5.4500,"volume" :1500 }
, { "Timestamp" :1383926006,"close" :5.5000,"high" :5.5000,"low" :5.5000,"open" :5.5000,"volume" :6800 }
, { "Timestamp" :1383926397,"close" :5.4900,"high" :5.5000,"low" :5.4900,"open" :5.5000,"volume" :7200 }
, { "Timestamp" :1383926581,"close" :5.5000,"high" :5.5000,"low" :5.5000,"open" :5.5000,"volume" :300 }
, { "Timestamp" :1383926970,"close" :5.5000,"high" :5.5000,"low" :5.4900,"open" :5.4900,"volume" :2100 }
]
这里我想提取“Timestamp”值大于某个整数的行。现在这个整数是从另一个数组中提取的,就像这样
"TimeStamp-Ranges" : [
{ "date" :20131108, "min" :1383921000, "max" :1383922360}
,{ "date" :20131111, "min" :1383922507, "max" :1383923891}
,{ "date" :20131112, "min" :1383924237, "max" :1383926006}
]
所以我想从名为“series”的数组中提取行,其中“Timestamp”值大于TimeStamp-Ranges [1] [“min”]。
当然我可以使用foreach()
轻松完成,但我想使用php的内置数组函数只是为了获得性能优势。
到目前为止,我已经编写了这么多代码,但是当我运行此代码时出现错误
这是代码
array_filter($this->JSON_data->series, function($minValue) use ($this->JSON_data->series and $this->JSON_data->{"TimeStamp-Ranges"}) {
return ($this->JSON_data->series->Timestamp > $this->JSON_data->{"TimeStamp-Ranges"}[count($this->JSON_data->{"TimeStamp-Ranges"}) - 1]->min);
})
请提供任何有关如何有效执行此操作的提示或指南,并再次强调性能原因,因为这需要实时完成,并且此数组操作可能每秒发生数千次。
先谢谢。任何帮助表示赞赏。 MAXX
答案 0 :(得分:1)
我知道这是一种俗气的解决方案,但我没有5.2以上的PHP,所以忍受我
出于性能原因,这可能更好地转换为静态解决方案
<?php
class ComplicatedFilterForComplicatedArray {
private $cond, $series;
function __construct($json) {$this->series = $json->series;}
function filterByRange(array $jsonRanges, $idx, $by='min') {
$this->cond = $jsonRanges[$idx]->{$by};
return array_filter($this->series,array($this,'filterFn'));
}
function filterFn($v) {return $v->timestamp > $this->cond;}
}
$f = new ComplicatedFilter($json_series);
$filteredSeries = $f->filterByRange($json_ts_ranges,1,'min');
非常感谢任何反馈,我很抱歉,这与优雅的解决方案并不相同 a la PHP > 5.3