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

时间:2013-11-29 14:11:49

标签: php arrays

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

1 个答案:

答案 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