我正试图从一个值大于某个整数的关联数组中获取特定范围的值。因此,有问题的数组是这样的(当然,这只是原始数组的一小部分,它至少有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-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
我知道这是一种俗气的解决方案,但我没有5.2.7以上的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 laPHP > 5.3