我正在尝试从数组中选择数据。我使用以下脚本。
我基本上有一个应该扫描数组并在最后一小时内找到结果的函数,但我认为我的函数存在一些问题。
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$result = 'array(2) {
["Status"]=>
string(3) "001"
["CallData"]=>
array(1) {
["item"]=>
array(36) {
["CallRef"]=>
string(10) "1234567890"
["CallStartDate"]=>
string(10) "2017-01-22"
["CallStartTime"]=>
string(8) "11:59:30"
}
}
}';
function getFilteredCallsByDate($calls, $since) {
return new CallbackFilterIterator(new ArrayIterator($calls['CallData']['item']), function ($call) use ($since) {
return strtotime(sprintf('%s %s', $call['CallStartDate'], $call['CallStartTime'])) >= strtotime($since);
});
}
// limit to last 60 minutes
foreach (getFilteredCallsByDate($result, '-60 minutes') as $call) {
var_dump($call);
}
?>
然而,当我运行此操作时,出现以下错误:
Warning: Illegal string offset 'CallData' in test.php on line 25
Warning: Illegal string offset 'item' in test.php on line 25
Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Passed variable is not an array or object, using empty array instead' in test.php:25
Stack trace:
#0 test.php(25): ArrayIterator->__construct('a')
#1 test.php(31): getFilteredCallsByDate('array(2) {\n\t [...', '-60 minutes')
#2 {main} thrown in test.php on line 25
有人可以帮助我调试这些错误并解决我收到它们的原因。
非常感谢。
答案 0 :(得分:1)
$ result不是数组,而是字符串。您已将其封装在引号中。
更新:除此之外:您的CallbackFilterIterator遍历result["CallData"]["item"]
中的每个条目。因此,在您的示例中,它将返回:
"1234567890", "2017-01-22", "11:59:30"
。
您可能想要做的是迭代result["CallData"]
而不是:
<?php
$result = ["Status"=>"001", "CallData" => ["item" => ["CallRef"=>"1234567890", "CallStartDate"=>"2017-01-22", "CallStartTime"=>"11:59:30"]]];
function getFilteredCallsByDate($calls, $since) {
return new CallbackFilterIterator(new ArrayIterator($calls['CallData']), function ($call) use ($since) {
return strtotime(sprintf('%s %s', $call['CallStartDate'], $call['CallStartTime'])) >= strtotime($since);
});
}
foreach (getFilteredCallsByDate($result, '-60 minutes') as $call) {
var_dump($call);
}
?>