拆分值大于某个整数的关联数组


Split an associative array with value greater than some integer

我正试图从一个值大于某个整数的关联数组中获取特定范围的值。因此,有问题的数组是这样的(当然,这只是原始数组的一小部分,它至少有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