从PHP Array中选择数据时出错

时间:2017-01-22 12:22:57

标签: php

我正在尝试从数组中选择数据。我使用以下脚本。

我基本上有一个应该扫描数组并在最后一小时内找到结果的函数,但我认为我的函数存在一些问题。

<?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

有人可以帮助我调试这些错误并解决我收到它们的原因。

非常感谢。

1 个答案:

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

}

?>